c++ - sintaxis - para que sirve int argc char*argv[]
¿Pueden los argumentos de la firma de main en C++ tener los calificadores unsiged y const? (7)
Debe usar una de las firmas de conformidad estándar para cumplir con los estándares.
Entiendo completamente por qué quieres hacerlo a tu manera. La mejor manera es escribir su propia función myMain () o lo que sea con la firma que desee y llamarla desde main (), incluidos los moldes necesarios.
Esta pregunta ya tiene una respuesta aquí:
- ¿Qué debería main () devolver en C y C ++? 19 respuestas
La norma establece explícitamente que main
tiene dos firmas válidas (es decir, garantizadas para trabajar); a saber:
int main();
int main(int, char*[]);
Mi pregunta es simple, algo como lo siguiente sería legal?
int main(const unsigned int, const char* const* argv);
Mis pruebas dicen ''sí'', pero no estoy seguro de la respuesta, porque ¿no estoy sobrecargando main
al cambiar int
a unsigned int
así como a la const
-ness no de nivel superior de argv? Si lo estoy, entonces eso está claramente prohibido.
Entonces, ¿se garantiza que estas modificaciones funcionen en un compilador que cumpla con los estándares?
El estándar C ++ 98 dice en la sección 3.6.1 párrafo 2
Una implementación no debe predefinir la función principal. Esta función no debe estar sobrecargada. Tendrá un tipo de retorno de tipo
int
, pero de lo contrario su tipo está definido por la implementación. Todas las implementaciones permitirán las siguientes definiciones demain
:int main()
eint main(int argc, char* argv[])
Por lo tanto, el estándar no exige que el main
aceptor de env sea aceptable, pero es permisible.
Debido a que se hace referencia a esto a menudo, aquí está el párrafo anterior que exime a los entornos independientes de cualquier cosa que no sea la documentación de su comportamiento:
Un programa debe contener una función global llamada main, que es el inicio designado del programa. Se define la implementación de si se requiere un programa en un entorno independiente para definir una función principal. [Nota: en un entorno independiente, el inicio y la finalización están definidos en la implementación; el inicio contiene la ejecución de constructores para los objetos del ámbito del espacio de nombres con una duración de almacenamiento estática; terminación contiene la ejecución de destructores para objetos con duración de almacenamiento estática. ]
Es posible que esto no funcione si el compilador utiliza el cambio de nombre para main
. Es una función de C ++ después de todo. Por lo tanto, el enlazador buscará dos "manglings" particulares. Su definición tendría otro nombre destrozado.
Tenga en cuenta que main
es especial (no se sobrecarga, no se puede llamar) y puede que no requiera ningún cambio de nombre.
ISO / IEC 9899: TC3
Sección 5.1.2.2.1 Inicio del programa
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 de int y sin parámetros:
int main(void) { /* ... */ }
o con dos parámetros (a los que se hace referencia aquí como argc y argv, aunque se pueden usar los nombres, ya que son locales para la función en la que se declaran):
int main(int argc, char *argv[]) { /* ... */ }
o equivalente; 9) o de alguna otra manera definida por la implementación.
Los punteros argv
no deben ser const char* const
porque el programa puede cambiar los búferes.
Por lo que puedo ver al leer el estándar, no estás cumpliendo con los estándares. Pero no puedo imaginarme un compilador que no te permita hacer esto. Al igual que en el caso, se necesitaría más trabajo del compilador para prohibir específicamente un caso extremo que en su mayoría es inofensivo y muy oscuro.
Puede ser ilegal según el estándar, pero a la mayoría de los tiempos de ejecución en realidad no les importa. Solo presionarán un entero para argc
y un puntero para argv
, llamarán a tu main
y espero que los analices correctamente. Por lo tanto, en su ámbito, "garantizado para trabajar" es discutible, ya que al cargador realmente no le importa cómo haya declarado los argumentos.
Si se genera, se llamará a main
. Cómo analizas los argumentos depende de ti. Debo aclarar que esto es altamente específico de la plataforma, como casi toda esta pregunta.
Dicho eso , ¿por qué?