Я просмотрел несколько сообщений, связанных с этой темой, но не смог полностью разобраться в своих сомнениях. Это может быть очень наивный вопрос.
У меня есть заголовочный файл inline.h
и две единицы перевода main.cpp
и tran.cpp
.
Подробности кода указаны ниже
inline.h
#ifndef __HEADER__
#include <stdio.h>
extern inline int func1(void)
{ return 5; }
static inline int func2(void)
{ return 6; }
inline int func3(void)
{ return 7; }
#endif
main.c
#define <stdio.h>
#include <inline.h>
int main(int argc, char *argv[])
{
printf("%d\n",func1());
printf("%d\n",func2());
printf("%d\n",func3());
return 0;
}
tran.cpp
//(note that the functions are not inline here)
#include <stdio.h>
int func1(void)
{ return 500; }
int func2(void)
{ return 600; }
int func3(void)
{ return 700; }
Приведенный выше код компилируется в g ++, но не компилируется в gcc (даже если вы вносите изменения, связанные с gcc, такие как изменение кода на .c, без использования каких-либо заголовочных файлов C ++ и т. Д.). Отображаемая ошибка: «Дубликат определения встроенной функции - func3».
Не могли бы вы уточнить, почему эта разница присутствует в разных компиляторах?
Кроме того, когда вы запускаете программу (скомпилированную с помощью g ++), создавая два отдельных модуля компиляции (main.o
и tran.o
) и создавая исполняемый файл a.out
, получается следующий вывод:
500
6
700
Почему компилятор выбирает определение функции, которая не является встроенной. На самом деле, поскольку #include
используется для «добавления» встроенного определения, которое я ожидал 5,6,7
в качестве вывода. Насколько я понимаю, во время компиляции, поскольку найдено встроенное определение, вызов функции будет «заменен» определением встроенной функции.
Не могли бы вы подробно рассказать мне о процессе компиляции и компоновки, который приведет нас к выводу 500,6,700
. Я могу понять только вывод 6.