Функция в c ++ с ключевым словом extern

Я просматриваю исходный код и нашел эти фрагменты

extern int main(); main();

и еще один

extern void create_network_device(int N, const char* route, const char* ip); create_network_device(0, "10.0.0.0/24", "10.0.0.1");

Что происходит в приведенном выше коде?

изменить: приведенные выше фрагменты находятся в файле .cpp. Они вызываются, как показано выше, без какого-либо кода между ними.


person karra    schedule 07.05.2018    source источник
comment
Что касается первого фрагмента с main, в C ++ на самом деле недопустимо вызывать main самостоятельно. Он не должен никогда вызываться вашим собственным кодом.   -  person Some programmer dude    schedule 07.05.2018
comment
@GauravSehgal Ссылка, которую вы предоставили, объясняет глобальные переменные, объявленные в файле заголовка. Приведенный выше код находится в файле .cpp, и я хочу узнать, почему они вызывают именно так.   -  person karra    schedule 07.05.2018
comment
Можете ли вы предоставить воспроизводимые разделы исходного кода, в которых он используется?   -  person AmeyaVS    schedule 07.05.2018
comment
@karra, это то же самое. Когда речь идет о компиляторе, файл .h является лишь частью текста файлов .cpp. См. 5.2 этапы перевода   -  person Swift - Friday Pie    schedule 07.05.2018
comment
@AmeyaVS По этой ссылке вы можете найти github.com/ hioa-cs / IncludeOS / blob / master / examples / TCP_perf / в строках 99 и 100   -  person karra    schedule 07.05.2018
comment
@Swift Хорошо. Но почему они звонят дважды? и только сейчас я видел в исходном коде было обновлено с main() до stream_main()   -  person karra    schedule 07.05.2018
comment
Функция не вызывается дважды, только один раз. Первый - это объявление функции, также называемое прототипом функции. Объявление необходимо, чтобы компилятор знал, что функция существует где-то в программе, и поэтому ее можно вызвать.   -  person Some programmer dude    schedule 07.05.2018
comment
именно то, что сказал Someprogrammerdude. Обратите внимание, что в указанной строке есть общие сведения с оператором вызова функции, который должен состоять из выражения, возвращающего объект функции (в простейшем случае, это будет имя функции), за которым следует список выражений, разделенных запятыми, окруженный круглыми скобками (может быть пустым list), предназначенные для передачи аргументов. Ваша строка extern имеет очевидные особенности объявления прототипа функции.   -  person Swift - Friday Pie    schedule 07.05.2018


Ответы (1)


Первый фрагмент технически является UB, потому что, если кажется, что программа где-то определяет функцию с внешней связью C ++ void main().

extern void create_network_device(int N, const char* route, const char* ip);
 create_network_device(0, "10.0.0.0/24", "10.0.0.1");

Строка, начинающаяся с extern, объявляет функцию create_network_device с внешней связью, затем следует вызов этой функции. Эта функция может быть в любом модуле компиляции программы.

person Swift - Friday Pie    schedule 07.05.2018