¿Es seguro cambiar el nombre de argc y argv en la función principal?


82

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.


21
Sí, completamente seguro.
David Hoelzer

55
Como dicen todas las respuestas, sí, es seguro. Pero por favor no hagas eso. Todo el mundo sabe lo que es argcy lo que argvsomos. n_of_argsy argspodría ser más claro para alguien que no sepa C o C ++, pero esa no es su audiencia.
Keith Thompson

4
Usted puede hacer esto, no es suficiente razón para hacer esto. Todos saben cuáles son y esperan que sean así.
SergeyA

10
Si la pregunta es precisamente "¿rompería algo si elijo nombres personalizados", entonces la respuesta precisa es "sí, rompería la tradición bien establecida";)
Frax

12
¡Solo dales la vuelta! .. y desde el principio estás sentando las bases para la seguridad laboral :)
yano

Respuestas:


121

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 mainfunción.

De la sección 5.1.2.2.1 de la norma C :

La función llamada al inicio del programa se nombra main. La implementación no declara ningún prototipo para esta función. Se definirá con un tipo de retorno de inty sin parámetros:

int main(void) { /*  ... */ }

o con dos parámetros (a los que se hace referencia aquí como argcy argv, aunque se puede utilizar cualquier nombre, ya que son locales a la función en la que se declaran ):

int main(int argc, char *argv[]) { /* ...   */ }

o equivalente; o de alguna otra manera definida por la implementación

Dicho esto, usar cualquier otra cosa que no sea argcy argvpodrí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.


38

Los nombres argcy en argvrealidad fueron obligatorios por el estándar C ++ antes de C ++ 11. Decía:

Todas las implementaciones permitirán las dos siguientes definiciones de principal:

int main ()

y

int main ( int argc , char * argv [])

y pasó a discutir los requisitos en argcy argv.

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

Todas las implementaciones permitirán tanto

  • una función de () regresar inty
  • una función de ( int, puntero al puntero a char) devolviendoint

como el tipo de main(8.3.5). En la última forma, para fines de exposición, se llama al primer parámetro de función y se llama argcal segundo parámetro de función argv, ...


29

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 como

 int 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.


5
sólo algunos identificadores están "escritos en la arena", como usted dice. los nombres de las funciones ciertamente no lo son.
Steve Cox

1
@SteveCox "los nombres de las funciones ciertamente no lo son". Al final lo son. Solo números de granos de arena
:-P

3
ok pero en serio. después de la compilación, el código objeto todavía tiene nombres de funciones. de lo contrario, la vinculación no funcionaría
Steve Cox

4
@ πάνταῥεῖ: A menos que haga un esfuerzo especial para eliminarlos, los nombres de las funciones permanecen en el ejecutable final.
Nick Matteo

1
@Kundor: después de vincular en Windows, todas las funciones no especiales no conservan los nombres
Dani


7

Sí, es seguro utilizar nombres diferentes.

Personalmente, no lo recomendaría, sin embargo, ya que son los tradicionales argcy argvson 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."


Sin embargo, hay algunos escenarios bastante obvios que exigen el uso de nombres diferentes, uno notorio es la inicialización de GLUT, 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 link
user3078414

@ user3078414 Ejemplo interesante, pero no veo cómo dice nada sobre el nombre de las variables. Según los ejemplos de esa otra pregunta, podríamos escribir fácilmente int dummyargc = 1; char *dummyargv[1] = {(char*)"Something"}; glutInit(&dummyargc, dummyargv);.
Steve Summit

Gracias, @ steve-summit. Parte de la documentación de la API resulta ser engañosa, por lo tanto, este hilo es más útil para resaltar la argc argvconvenció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 SO
user3078414

5

Sí, puede cambiarles el nombre que desee. Son simplemente nombres de parámetros de funciones, nada más.


3

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:

principal (int argumentoCount, char ** argumentoVector)

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.

main (int maxArgumentsIndex, char ** argumentos).

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:

función void (const unsigned int maxArgumentsIndex, const char ** argumentos)

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;)


2

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, mainsino 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


0

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.


-1

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".


Esas no son constantes, solo sustitución.
David Dunham
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.