c++ main extern linkage

¿Es legal C++ declarar main como extern "C"?



linkage (3)

Siendo un programador de bajo nivel, a menudo trabajo con el código de inicio del módulo para los ejecutables, así que entiendo bastante bien cómo funciona el código como "crt0". Al escribir el código C ++, generalmente he declarado main como extern "C" para que coincida con lo que el código de inicio de C va a hacer para llamar main . Por lo tanto, normalmente uso esta declaración para main (y wmain si se dirige específicamente a Windows):

extern "C" int main(int argv, const char *const *argv) extern "C" int __cdecl wmain(int argv, const wchar_t *const *argv)

¿Es legal usar extern "C" en main ? Además, ¿es const char *const * legal para el tipo argv en lugar de char *[] ?


El estándar bendice dos formas de main :

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

Estas formas son lo que cualquier implementación debe reconocer. Todo lo demás es que su implementación sea fácil con su código y le permita ser creativo. No es ilegal, ya que el estándar específicamente le permite reconocer otras formas de main .

El código de inicio normalmente se escribe de una manera que le permite llamar a main sin tener una declaración de vinculación, porque así es como el estándar dice que main debería ser. El compilador generalmente trata a main especialmente por tener un enlace C, según lo permitido por el estándar, así es como el código de inicio lo declara. Esto no es de interés para un programador normal. Él sólo necesita seguir el estándar.


La vinculación es la implementación definida (3.6.1p3):

El enlace (3.5) de main está definido por la implementación.

Además, para su última pregunta, es perfectamente aceptable tener const char* const* (3.6.1p2):

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.


extern "C" solo le dice al compilador de C ++ específicamente que NO decore o use la manipulación de nombres en las etiquetas de función generadas.

Sí, ambos son legales.