Muchos programas utilizan nombres estándar para varios argumentos y matrices de cadenas. El prototipo de las principales miradas función como: int main(int argc, char *argv[]);
. Pero, ¿rompería algo si elijo nombres personalizados para estas variables?
P.ej int main(int n_of_args, char *args[]);
En el contexto del compilador, todo está bien. Estas variables son locales para la función principal, por lo que pueden tener cualquier nombre. Y el código simple se construye y se ejecuta perfectamente. Pero estos nombres pueden ser usados por el preprocesador. Entonces, ¿es seguro cambiar el nombre de estos argumentos?
PD: Personalmente encuentro malos estos nombres, porque se parecen mucho y difieren en una sola letra. Pero TODOS los usan por alguna razón.
argc
y lo queargv
somos.n_of_args
yargs
podría ser más claro para alguien que no sepa C o C ++, pero esa no es su audiencia.Respuestas:
Sí, es seguro, siempre que utilice nombres de variable válidos. Son variables locales, por lo que su alcance no va más allá de la
main
función.De la sección 5.1.2.2.1 de la norma C :
Dicho esto, usar cualquier otra cosa que no sea
argc
yargv
podría confundir a otros que lean su código y que estén acostumbrados a los nombres convencionales para estos parámetros. Así que mejor errar por el lado de la clarividencia.fuente
Los nombres
argc
y enargv
realidad fueron obligatorios por el estándar C ++ antes de C ++ 11. Decía:y pasó a discutir los requisitos en
argc
yargv
.Entonces, técnicamente, cualquier programa que usara nombres diferentes no cumplía con los estándares, y el compilador podía rechazarlo. Ningún compilador lo hizo en realidad, por supuesto. Vea este hilo en comp.std.c ++ , o la sección 3.6.1 de este borrador de estándar C ++ 03 .
Esto fue casi con certeza un mero descuido, y se cambió en C ++ 11, que en su lugar dice
fuente
Seguro que puedes cambiar el nombre de estos parámetros de forma segura como quieras
int main(int wrzlbrnft, char* _42[]) { }
Los nombres están escritos en arena. No tienen ninguna influencia en el código finalmente compilado.
Lo único que importa es que los tipos de parámetros de declaración y definición realmente coincidan.
La firma de la
main()
función se declara intrínsecamente comoint main(int, char*[]);
si necesita usarlos en una implementación, en realidad deberá nombrarlos. Los nombres que se utilizan son realmente irrelevantes, como se mencionó anteriormente.
fuente
Si. Es seguro, parece extraño, pero no romperá nada.
fuente
Sí, es seguro utilizar nombres diferentes.
Personalmente, no lo recomendaría, sin embargo, ya que son los tradicionales
argc
yargv
son tan conocidos y familiares para cualquier otro programador de C que pueda trabajar con su código. A la larga, el uso de nombres propios, especiales y diferentes provocará mucha más confusión y / o frustración entre sus lectores de lo que jamás le salvará porque le gustan más sus nombres."Cuando fueres haz lo que vieres."
fuente
glutInit(&argc, argv)
donde los argumentos deben declararse e inicializarse de manera diferente, para no permitir que GLUT se coma los argumentos de la línea de comandos, a menos que queramos. SO linkint dummyargc = 1; char *dummyargv[1] = {(char*)"Something"}; glutInit(&dummyargc, dummyargv);
.argc argv
convención de nomenclatura, al igual que su respuesta contribuyente. Solo pongo mi comentario como ejemplo de usar preferiblemente cualquier nombre diferente. Aquí está el enlace SOSí, puede cambiarles el nombre que desee. Son simplemente nombres de parámetros de funciones, nada más.
fuente
Siento que todos han cubierto bien las reglas técnicas de C ++: la respuesta es sí. Dejemos de lado la tradición y el hecho de que esta función en particular es especial e icónica, lo que contiene puntos válidos para no cambiar sobre esta base.
A menudo, siento que la filosofía de las elecciones rara vez se discute y, por lo tanto, quería ofrecer una perspectiva sobre este asunto, ya que creo que es importante para la razón por la que se pidió esto para empezar.
Esta pregunta para mí implica una elección para expresar inglés en código en general. Parece que le molestan las descripciones de mano corta, en particular, si la mano corta tiene un texto de apariencia similar. Sin embargo, en su ejemplo, cambiar argn a n_of_args solo logra el cambio de un tipo de abreviatura a otra forma de taquigrafía sin valor añadido real: aclaración u otras propiedades visibles.
La palabra 'número' ha sido reemplazada por una letra 'n'.
Si está cambiando un nombre de mano corta a través de la filosofía de anti mano corta, entonces algo como esto puede parecer más apropiado:
Siempre pienso en dos cosas: nombrar las cosas por lo que son y / o por su uso implícito. Llamarlo un argumento vector es redundante para mí ya que la propiedad de ser un vector está implícita en la doble indirección **. Por lo tanto, una mejor forma de escribir el código es: ** argumentos.
Algunos dirían que la variable llamada argumentCount se declara como int y Count no puede ser negativo, pero puede tener un int negativo {unsigned is better}.
Nuevamente, lo que es y cómo se usa entra en juego en esta interpretación. Si es un Conde, entonces asumiría que nunca sería negativo. Después de todo, ¿cómo se puede contar con -2 manzanas? Yo diría que DEBES dos manzanas. Si es un Número, entonces esperaría que fuera posible un caso negativo. Es por eso que la palabra adicional "de" probablemente sea importante para usted. Eso, y quizás un número al que se refiere una colección, implica un elemento específico en lugar de una propiedad de la colección en sí. Es decir: argumentNumber = 5 implica un argumento específico pero no numberOfArguments.
Esto elimina la ambigüedad. Llamarlo índice elimina la ambigüedad negativa entre mayúsculas y minúsculas y también describe qué es y, además, cómo usarlo. También implica por la redacción en inglés que un máximo es un absoluto y se sentiría extraño al escribir un código que modifica este valor (debería ser constante). 'argumentos' tiene sentido aquí ya que es plural, describe qué es y cómo debería usarse ya. Incluso interpretarlo de esta manera puede ser peligroso ya que un índice es -1 de un Count / NumberOf. ¡¡5 argumentos dan un índice máximo de 4 !!
Cualquier otra función y la usaría por completo:
No todas las situaciones merecen descripciones largas. De hecho, algunas veces una mano corta produce más legibilidad, en particular, en el caso de clases de matemáticas de escritura como Vec3f, Matrix, Quaternion, etc. Casi siempre intentaré emparejar el lenguaje matemático en lugar del lingüístico. . flotar x, y, z vrs. float xComponent y similares.
Entiendo que todo esto es una elección de estilo, pero ser consciente de las opciones realmente ayudará a largo plazo. Garantizo que los programadores experimentados se molestan cuando las matrices no están escritas en forma plural, pero, de nuevo, main es una prosa de existencia especial;)
fuente
Según los estándares C, sí, puede cambiar el nombre, nada va a afectar. Como entendí, en lenguaje C, los nombres de palabras clave / tipos / tokens predeterminados se definieron con propósito / uso, por lo que de la misma manera se definen los nombres
argc --> argument count argv --> argument vector
que también tiene sentido en términos de uso, por lo que puede cambiar a cualquier nombre que se espere
Reserved names
En GCC, la ejecución del programa comienza con el nombre de la función
main
, no depende de sus parámetros.Cuando escribe un programa independiente para microcontroladores, no necesita preocuparse por el nombre,
main
sino que puede definir el suyoname
y cambiar el punto de entrada del ensamblaje para señalar su función. Depende del compilador del controlador y de la disponibilidad del código fuente del controlador predefinido. Hice esto en el controlador Freescale bajo Code-warrior.Mi nota:
Es mejor seguir los estándares / estilos de código comunes para hacer que el código sea más visible y legible
fuente
Es seguro en lo que respecta al compilador.
El único problema que esto puede causar es confusión. Las personas que lean su código esperarán que esas dos variables tengan sus nombres estándar. Incluso podrías hacer algo como esto:
int main(int foo, char ** bar) { int argc; float argv;
Pero no creo que deba decir qué tan mala práctica sería esta.
fuente
Si no le gustan los nombres de las variables, ¿por qué no sustituirlos por la macro #define :
#define yourCounterName argc #define yourVectorName argv
No correrá ningún riesgo y producirá una "solución limpia".
fuente