¿Pueden los argumentos de la firma principal en C ++ tener los calificadores sin signo y const? [duplicar]

StackOverflow https://stackoverflow.com/questions/1621574

  •  06-07-2019
  •  | 
  •  

Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

El estándar establece explícitamente que main tiene dos firmas válidas (es decir, con garantía de funcionamiento); a saber:

int main();
int main(int, char*[]);

Mi pregunta es simple, ¿sería legal algo como lo siguiente?

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 cambiando int a unsigned int así como el const -ness de argv? Si lo estoy, eso está claramente prohibido.

Entonces, ¿se garantiza que estas modificaciones funcionarán en un compilador que cumpla con las normas?

¿Fue útil?

Solución

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. Deberá tener un tipo de retorno de tipo int , pero de lo contrario, su tipo está definido por la implementación. Todas las implementaciones permitirán tanto las siguientes definiciones de main : int main () como int main (int argc, char * argv [])

Por lo tanto, no es obligatorio por la norma que el env que acepta main sea aceptable pero está permitido.


Debido a que esto se menciona con frecuencia, aquí está el párrafo anterior que exime a los entornos independientes de cualquier cosa que no sea documentar su comportamiento:

  

Un programa contendrá una función global llamada main, que es el inicio designado del programa. Es   implementación definida   si se requiere un programa en un entorno independiente para definir un principal   función. [Nota: en un entorno independiente, arranque   y la terminación es la implementación definida;   puesta en marcha   contiene la ejecución de constructores para objetos de ámbito de espacio de nombres con duración de almacenamiento estático; terminación   Contiene la ejecución de destructores para objetos con duración de almacenamiento estático. ]

Otros consejos

Debe usar una de las firmas de conformidad con la norma para ser de conformidad con la norma.

Entiendo perfectamente 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 caracteres requeridos.

Los punteros argv no deben ser const char * const porque el programa puede cambiar los buffers.

Por lo que puedo ver al leer el estándar, no está cumpliendo con los estándares. Pero no puedo imaginar un compilador que no te permita hacer esto. Al igual que en, se necesitaría más trabajo del compilador para prohibir específicamente un caso de borde que es en su mayoría inofensivo y muy oscuro.

Esto puede no funcionar si el compilador utiliza la denominación de nombres para main . Es una función de C ++ después de todo. Por lo tanto, el enlazador buscará dos "destellos" específicos. Tu definición tendría otro nombre mutilado.

Tenga en cuenta que main es especial (no se sobrecarga, no se puede llamar) y puede que no requiera la manipulación de nombres en absoluto.

Puede que sea ilegal según el estándar, pero a la mayoría de los tiempos de ejecución no les importa. Simplemente presionarán un entero para argc y un puntero para argv , llamarán a su main y esperarán que los analice correctamente. Por lo tanto, en su ámbito, "trabajo garantizado" es discutible ya que al cargador realmente no le importa lo que ha declarado como argumentos.

Si se construye, se llamará a main . Cómo analizar los argumentos depende de usted. Debería aclarar que esto es altamente específico de la plataforma, como lo es casi toda esta pregunta.

Dicho esto, por qué?

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 declara no 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 (referidos aquí como argc y argv, aunque cualquier nombre puede ser utilizados, ya que son locales a 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top