Подтвердить что ты не робот

Является ли законным С++ объявлять main как extern "C"?

Будучи низкоуровневым программистом, я часто работаю с кодом запуска модуля для исполняемых файлов, поэтому я хорошо понимаю, как работает код типа crt0. При написании кода на С++ я обычно объявлял main как extern "C", чтобы соответствовать тому, что должен сделать код запуска C, чтобы вызвать main. Обычно я использую это объявление для mainwmain, если оно специально предназначено для Windows):

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

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

Можно ли использовать extern "C" на main? Кроме того, const char *const * является законным для типа argv, а не char *[]?

4b9b3361

Ответ 1

Связь определяется реализацией (3.6.1p3):

Связь (3.5) основной определяется реализацией.

Кроме того, для вашего последнего вопроса вполне приемлемо иметь const char* const* (3.6.1p2):

Реализация не должна предопределять основную функцию. Эта функция не должны быть перегружены. Он должен иметь тип возвращаемого типа int, но в противном случае его тип определяется реализацией.

Ответ 2

Стандарт благословляет две формы main:

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

Эти формы - это то, что должна распознать любая реализация. Все остальное - ваша реализация проста с вашим кодом и позволяет вам быть творческим. Это не является незаконным, поскольку стандарт специально позволяет ему распознавать другие формы main.

Код запуска обычно записывается таким образом, что позволяет ему вызывать main без объявления привязки, поскольку это означает, что в стандарте указано main. Компилятор обычно относится к main специально, поскольку имеет C-ссылку, как разрешено стандартом, так, как это объявляет код запуска. Это не представляет интереса для обычного программиста. Ему просто нужно следовать стандарту.

Ответ 3

extern "C" сообщает только компилятору С++, чтобы НЕ украшать или использовать перебор имен на сгенерированных ярлыках функций.

Да, оба являются законными.