¿Main () está sobrecargado en C++?


Existen 2 versiones válidas de main() en C++:

int main()  // version 1
int main(int argc, char **argv)  // version 2

Pero ambas sobrecargas no pueden coexistir al mismo tiempo. ¿Por qué no? (Caso de uso potencial: mientras se ejecuta el programa desde el terminal, si no se pasan argumentos se llama a la primera versión, de lo contrario se llama a la segunda versión.)

¿Realiza el compilador una comprobación especial para permitir solo una versión por binario?

Author: James Ko, 2011-06-20

6 answers

§3.6.1/2 (C++03) dice

Una aplicación no deberá predefinirse la función main. Esta función deberá no estar sobrecargado. Tendrá un devuelve tipo de tipo int, pero por lo demás su tipo está definido por la implementación. Todas las implementaciones permitirán ambos de las siguientes definiciones de main:

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

Puedes usar cualquiera de ellos. Ambos son compatibles con el estándar.

También, ya que char *argv[] es equivalente a char **argv, reemplazando char *argv[] con char **argv no hace ninguna diferencia.


¡Pero ambas versiones no pueden coexistir al mismo tiempo ! (el caso de uso puede ser como: mientras se ejecuta el binario desde el símbolo del sistema, si no pasa ningún argumento, entonces la 1ª versión debe llamarse de lo contrario la 2ª versión).

No. Ambas versiones no pueden coexistir al mismo tiempo. Un programa puede tener exactamente una función main. Cuál, depende de tu elección. Si desea procesar el argumento de línea de comandos, entonces debe elegir el la segunda versión, o bien la primera versión es suficiente. También tenga en cuenta que si utiliza la segunda versión, y no pasa ningún argumento de línea de comandos, entonces no hay daño en ella. No causará ningún error. Solo tienes que interpretar argc y argv en consecuencia, y basado en su valor, tienes que escribir la lógica y el flujo de tu programa.

 64
Author: Nawaz,
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
2011-07-28 23:52:48

Windows y Unix tienen:

int main(int argc, char **argv, char **envp)

Y las aplicaciones Win32 tienen:

int WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);

Y macOS tiene:

int main(int argc, char **argv, char **envp, char **apple)

No olvide que main no suele ser lo primero que el sistema operativo llama al ejecutar un programa. La función main es la función que es llamada por el entorno de tiempo de ejecución. La dirección de la primera instrucción a ejecutar normalmente se declara en algunos metadatos, normalmente al inicio si el archivo ejecutable.

Nada de lo anterior contradice el estándar C/C++ en lo que respecta a I se puede decir, siempre y cuando solo haya uno, lo cual tiene sentido ya que el sistema operativo no sabría a qué llamar si hubiera más de uno. Comprobar que solo hay uno no se hace en el compilador, se hace en el enlazador.

 20
Author: Skizz,
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
2011-06-20 08:02:29

La sección 3.6.1.2 de ambas ediciones del estándar C++ de 1998 y 2003 establece:

Una aplicación no definirá previamente la función principal. Esta función no se sobrecargará. Tendrá un tipo de retorno de tipo int, pero por lo demás su tipo está definido por la implementación.

Además,

El estándar ISO C++ (ISO/IEC 14882:1998) requiere específicamente que main devuelva int. Tiene una restricción explícita de "voluntad" sobre programas bien formados.

Sección § 3.6.1 ¶ 2:

Tendrá un tipo de retorno de int, pero por lo demás su tipo está definido por la implementación. Todas las implementaciones permitirán las dos definiciones siguientes de main:

int main() { /* … */ }

Y

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

Así que ambas versiones de main están permitidas por el estándar y cuál usar se deja como una preferencia de implementación del programador.

 13
Author: Alok Save,
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
2011-09-16 09:10:52

Main se definió en los días C. Está configurado más a lo largo de las reglas de printf. Considere main como una función varádica:

int main(...)

El estándar dice que no hay argumentos y dos argumentos puntero están bien. Sin embargo, si la implementación quiere proporcionar más argumentos, la implementación es libre de hacerlo.

La razón por la que no puedes tener dos mains es la misma razón por la que no puedes definir una función similar a printf dos veces en un programa C. Claro, printf soporta diferentes argumentos y cambios su comportamiento depende de qué argumentos están ahí, pero no se está sobrecargando en el sentido de C++ del término.

 9
Author: Billy ONeal,
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
2011-06-20 08:13:12

El estándar dice que main no se puede sobrecargar. No está mutilado, y no puede tener dos funciones con el mismo nombre no mezclado. Esto causará un error de enlace, supongo, pero un compilador podría querer agregar comprobaciones explícitas para dar mensajes de error más claros.

int main(int argc, char **argv) y int main() deberían ser las firmas preferidas para ello, pero los compiladores son libres de aceptar un main con diferentes parámetros.

 7
Author: peoro,
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
2011-06-20 07:49:53

No es posible sobrecargar main() en C++ porque. el compilador mostró el siguiente error:

error C2731: 'main' : function cannot be overloaded 
 0
Author: Dheeraj Bansal,
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
2011-07-28 14:16:38