c++ - sirve - que es main en programacion
¿Es seguro cambiar el nombre de argc y argv en la función principal? (10)
Muchos programas usan nombres estándar para varios argumentos y matrices de cadenas.
El prototipo de la función principal se ve así:
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. Entonces, ¿es seguro cambiar el nombre de estos argumentos?
PD: Personalmente, considero que estos nombres son malos, porque se ven muy similares y difieren en una sola letra. Pero TODOS los usan por algún tipo de razón.
Claro que puede cambiar el nombre de estos parámetros de forma segura como desee
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 necesita usarlos en una implementación, deberá nombrarlos. Los nombres que se usan son irrelevantes como se mencionó anteriormente.
Es seguro en lo que respecta al compilador.
El único problema que esto puede causar es la confusión. Las personas que leen 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 necesite decir cuán mala práctica sería esta.
Los nombres
argc
y
argv
realidad fueron obligatorios por el estándar C ++ antes de C ++ 11.
Declaró:
Todas las implementaciones deberán permitir 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
.
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, por supuesto. Vea este hilo en comp.std.c ++ , o la sección 3.6.1 de este borrador del estándar C ++ 03 .
Esto fue casi con certeza un mero descuido, y se cambió en C ++ 11, que en cambio dice
Todas las implementaciones permitirán ambos
- una función de () devolver
int
y- una función de (
int
, puntero a puntero achar
) que devuelveint
como el tipo de
main
(8.3.5). En la última forma, para fines de exposición, el primer parámetro de función se llamaargc
y el segundo parámetro de función se llamaargv
, ...
Sí, es seguro usar nombres diferentes.
Sin embargo, personalmente no lo recomendaría, ya que los
argc
tradicionales
argc
y
argv
son muy conocidos y familiares para cualquier otro programador de C que pueda trabajar con su código.
A la larga, usar sus propios nombres especiales y diferentes provocará mucha más confusión y / o frustración entre sus lectores de lo que lo salvará alguna vez porque le gustan más sus nombres.
"Cuando fueres haz lo que vieres."
Sí, es seguro, siempre que utilice nombres de variables válidos.
Son variables locales, por lo que su alcance no va más allá de la función
main
.
De la sección 5.1.2.2.1 del estándar C :
La función llamada al inicio del programa se llama
main
. La implementación no declara ningún prototipo para esta función. Se definirá con un tipo de retorno deint
y sin parámetros:
int main(void) { /* ... */ }
o con dos parámetros (referidos aquí como
argc
yargv
, aunque se pueden usar nombres, ya que son locales para 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 algo 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 errar por el lado de la claridad.
Sí, puedes cambiarles el nombre como quieras. Son simplemente nombres de parámetros de funciones, nada más.
Sí. Es seguro, se ve raro, pero no romperá nada.
Según los estándares C, sí, puede cambiar el nombre, nada va a afectar. Como entendí, en el lenguaje C, los nombres predeterminados de palabras clave / tipos / tokens se definieron con propósito / uso, 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 escribe un programa independiente para microcontroladores, no necesita preocuparse por el nombre
main
sino que puede definir su propio
name
y cambiar el punto de entrada de ensamblaje para señalar su función.
Depende del compilador del controlador y de la disponibilidad del código fuente del controlador predefinido.
Lo hice en el controlador Freescale con Code-warrior.
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
Si no le gustan los nombres de variables, ¿por qué no sustituirlos con la macro #define :
#define yourCounterName argc
#define yourVectorName argv
No correrá ningún riesgo y producirá una "solución limpia".
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 particular 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 discute y, por lo tanto, quería ofrecer una perspectiva sobre este asunto, ya que creo que es importante por la razón por la que se pidió esto.
Esta pregunta para mí implica una opción para expresar el inglés en código en general. Parece que le molestan las descripciones cortas de la mano, en particular, si la mano corta tiene un texto similar. Sin embargo, en su ejemplo, el cambio de argn a n_of_args solo logra el cambio de un tipo de mano corta a otra forma de taquigrafía sin adición de valor 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 la mano anti corta, entonces algo como esto puede parecer más apropiado:
main (int argumentoCount, char ** argumentoVector)
Siempre pienso en dos cosas: nombrar las cosas por lo que son y / o por su uso implícito. Llamarlo argumentoVector 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 código es: ** argumentos.
Algunos dirían que la variable denominada argumentoCount se declara como un int y un Count no puede ser negativo, pero puede tener un int negativo {unsigned es mejor}.
Una vez más, lo que es y cómo se usa viene a jugar en esta interpretación. Si es un conde, supongo que nunca sería negativo. Después de todo, ¿cómo puedes tener un conteo de -2 manzanas? Yo diría que DEBES dos manzanas. Si es un Número, entonces esperaría que fuera posible un caso negativo. Por eso es probable que la palabra adicional ''de'' sea importante para usted. Eso, y tal vez un número al que se refiere una colección implica un elemento específico en lugar de una propiedad de la colección misma. Es decir: argumentosNumber = 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 de mayú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 un código de escritura extraño que modifica este valor (debería ser constante). ''argumentos'' tiene sentido aquí ya que es plural, describe qué es y cómo ya debería usarse. Incluso interpretar de esta manera puede ser peligroso ya que un Índice es -1 de un Conteo / Número de. ¡¡5 argumentos producen un maxIndex de 4 !!
Cualquier otra función y usaría por completo:
función vacía (const unsigned int maxArgumentsIndex, const char ** argumentos)
No todas las situaciones merecen descriptores largos. De hecho, algunas veces una mano corta produce más legibilidad, en particular, en el caso de escribir clases de matemáticas como Vec3f, Matrix, Quaternion, etc. Casi siempre intentaré combinar el lenguaje matemático en lugar del lingüístico. . flotador x, y, z vrs. flotador xComponent y similares.
Entiendo que todo esto es una elección de estilo, pero ser consciente de las elecciones 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 especial de existencia;)