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


Muchos programas usan nombres estándar para varios argumentos y matrices de cadenas. El prototipo de la función principal se parece a: int main(int argc, char *argv[]);. ¿Pero rompería algo si elijo nombres personalizados para estas variables?

Por ejemplo 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 utilizados por el preprocesador. Así que es seguro cambiar el nombre estos argumentos?

PS Personalmente encuentro estos nombres malos, porque se ven muy similares y difieren en una sola letra. Pero todos los usan por alguna razón.

 80
Author: LeopardSkinPillBoxHat, 2016-04-29

10 answers

Sí, es seguro, siempre y cuando use nombres de variables válidos. Son variables locales, por lo que su ámbito no va más allá de la función main.

De la sección 5.1.2.2.1 de la norma C :

La función llamada al inicio del programa se llama main. El la implementación no declara ningún prototipo para esta función. Deberá se define con un tipo de retorno de int y sin parámetros:

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

O con dos parámetros (referidos a aquí como argc y argv, aunque alguna se pueden utilizar nombres, ya que son locales a la función en la que se encuentran declarado):

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

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

Dicho esto, usar cualquier otra cosa que no sea argc y argv podría confundir a otros que leen su código que están acostumbrados a los nombres convencionales para estos parámetros. Así que es mejor equivocarse del lado de la clarividencia.

 116
Author: dbush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-30 17:47:43

Los nombres argc y argv fueron en realidad ordenados por el estándar de C++ anterior a C++11. It stated:

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

int main ()

Y

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

Y pasó a discutir los requisitos en argc y argv.

Así que técnicamente, cualquier programa que usara nombres diferentes no era conforme al estándar, y al compilador se le permitió rechazarlo. Ningún compilador realmente lo hizo, por supuesto. Ver este hilo en comp.ETS.c++, o sección 3.6.1 de este borrador de norma C++03.

Esto fue casi seguramente un mero descuido, y se cambió en C++11, que en su lugar dice

Todas las implementaciones permitirán tanto {[14]]}

  • una función de () que devuelve int y
  • una función de (int, puntero a puntero a char) devuelve int

Como el tipo de main (8.3.5). En esta última forma, a efectos de exposición, el primer parámetro de función se llama argc y el segundo se llama al parámetro de funciónargv,...

 36
Author: Kundor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-04 14:52:55

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

La firma de la función main() se declara intrínsecamente como

 int main(int, char*[]);

Si necesitas usarlos en una implementación en realidad necesitarás nombrarlos. Qué nombres se utilizan es en realidad irrelevante como se mencionó antes.

 28
Author: πάντα ῥεῖ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-16 17:43:02

Sí. Es seguro, se ve raro, pero no romperá nada.

 15
Author: coredump,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-30 10:07:19

Sí, es seguro usar nombres diferentes.

Personalmente, no lo recomendaría, sin embargo, ya que los tradicionales argc y argv son tan conocidos y familiares para todos los demás programadores de C que podrían trabajar con su código. A la larga, usar tus propios nombres especiales y diferentes causará mucha más confusión y / o frustración entre tus lectores de lo que te salvará porque te gustan más tus nombres.

"Cuando estés en Roma, haz lo que hacen los romanos."

 7
Author: Steve Summit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-29 21:47:45

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

 5
Author: orbitcowboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-29 18:58:00

Creo que todo el mundo ha cubierto bien las reglas técnicas de c++: La respuesta es sí. Dejemos a un lado la tradición y el hecho de que esta función particular 1 es especial e icónica que contiene puntos válidos para no cambiar sobre esta base.

Muchas veces, siento que la filosofía de las elecciones rara vez se discuten y por lo tanto quería ofrecer una perspectiva sobre este asunto, ya que siento que es importante para la razón por la que se pidió esto, para empezar.

Esta pregunta para mí implica un elección en la expresión del inglés en código en general. Usted parece ser molestado por las descripciones cortas de la mano, en particular, si la mano corta aterriza texto de aspecto similar. En su ejemplo, sin embargo, cambiar argn a n_of_args solo logra el cambio de un tipo de mano corta en otra forma de taquigrafía sin adición de valor real: clarificación u otras propiedades visibles.

La palabra "número" se ha sustituido por la letra "n".

Si está cambiando un nombre de mano corto a través del filosofía de anti mano corta, entonces algo como esto puede parecer más apropiado:

Main (int argumentCount, char * * argumentVector)

Siempre pienso en dos cosas: Nombrar las cosas por lo que son y/o por su uso implícito. Llamarlo un argumentVector es redundante para mí ya que la propiedad de ser un vector está implícita por la doble indirección **. Por lo tanto, una mejor mano larga para cómo escribiría código es: ** argumentos.

Algunos dirían que el la variable denominada argumentCount se declara como un int y un Count no puede ser negativo, pero puede tener un int negativo {unsigned is better}.

Una vez más, lo que es y cómo se utiliza viene a jugar en esta interpretación. Si es un Recuento, entonces asumiría que nunca sería negativo. Después de todo, ¿cómo se puede tener una cuenta de -2 manzanas. Yo diría que debes dos manzanas. Si se trata de un Número, entonces esperaría que un caso negativo fuera posible. Esta es la razón por la palabra adicional 'de' es probable importante para ti. Eso, y tal vez un número como se refiere a una colección implica un elemento específico en lugar de una propiedad de la colección en sí. Ie: argumentsNumber = 5 implica un argumento específico pero no un número de argumentos.

Main (int maxArgumentsIndex, char * * argumentos).

Esto elimina la ambigüedad. Llamarlo índice elimina la ambigüedad de casos negativos y también describe qué es, y además cómo usarlo. También implica por la redacción en inglés que un max es un absoluto y se sentiría raro escribir código que modifica este valor (debería ser const). 'argumentos' tiene sentido aquí, ya que es plural, describe lo que es, y cómo se debe utilizar ya. Incluso interpretar de esta manera puede ser peligroso ya que un índice es -1 de un Count/NumberOf. 5 argumentos produce un maxIndex de 4!!

Cualquier otra función y yo usaría completamente:

Función Void (const unsigned int maxArgumentsIndex, const char ** argumento )

No todas las situaciones merecen descriptores de mano larga. De hecho, algunas veces una mano corta produce más legibilidad, en particular, en el caso de escribir clases de matemáticas como un Vec3f, Matrix, Quaternion, etc... Casi siempre trataré de hacer coincidir el lenguaje matemático en lugar del lingüístico. flotador x, y, z vrs. float xComponent y similares.

Entiendo que todo esto es una elección de estilo, pero ser consciente de las elecciones realmente ayudará a largo plazo. Te garantizo los programadores experimentados se molestan cuando los arrays no están escritos en plural, pero de nuevo, main es una prosa especial de la existencia;)

 3
Author: JMan Mousey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-18 20:00:23

Según los estándares C, Sí puede cambiar el nombre, Nada va a impactar. Según entendí, en el lenguaje C, las palabras clave/tipos/nombres de token predeterminados se definieron con purpose / usage, por lo que de la misma manera se definen 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 esperar 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 escribes un programa independiente para micro controladores, no es necesario preocuparse por el nombre main en su lugar puede definir su propio name y cambiar el entry_point de ensamblaje para apuntar su función. Depende del compilador del controlador y de la disponibilidad del código fuente del controlador predefinido. He hecho esto en Freescale controller bajo Código-guerrero.

Mi Nota:

Es mejor seguir los estándares comunes / estilo de código para hacer que el código sea más visible y legible

 2
Author: Thiru Shetty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-13 08:32:24

Es seguro en lo que respecta al compilador.

El único problema que esto puede causar es la confusión. Las personas que lean tu 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 necesite decir cuán mala práctica sería esto.

 0
Author: Broman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-13 06:29:12

Si no te gustan los nombres de variables, por qué no sustituirlos con la macro # define :

#define yourCounterName argc
#define yourVectorName  argv 

No asumirá ningún riesgo y producirá una "solución limpia".

 -1
Author: Imabot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-18 20:43:50