Является ли законным С++ объявлять main как extern "C"?
Будучи низкоуровневым программистом, я часто работаю с кодом запуска модуля для исполняемых файлов, поэтому я хорошо понимаю, как работает код типа crt0. При написании кода на С++ я обычно объявлял main
как extern "C"
, чтобы соответствовать тому, что должен сделать код запуска C, чтобы вызвать main
. Обычно я использую это объявление для main
(и wmain
, если оно специально предназначено для 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 *[]
?
Ответы
Ответ 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"
сообщает только компилятору С++, чтобы НЕ украшать или использовать перебор имен на сгенерированных ярлыках функций.
Да, оба являются законными.