Я прочитал некоторые сообщения, связанные с этой темой, но не смог полностью разобраться со своими сомнениями. Это может быть очень наивный вопрос.
У меня есть файл заголовка 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, не используя файлы заголовков С++ и т.д.). Отображаемая ошибка представляет собой "дублирующее определение встроенной функции - func3".
Можете ли вы пояснить, почему эта разница присутствует во всех компиляторах?
Кроме того, когда вы запускаете программу (g++ compiled), создавая два отдельных блока компиляции (main.o
и tran.o
) и создавая исполняемый файл a.out
, полученный результат:
500
6
700
Почему компилятор выбирает определение функции, которая не является встроенной. Фактически, поскольку #include
используется для "добавления" встроенного определения, которое я ожидал 5,6,7
в качестве вывода. Мое понимание было во время компиляции, поскольку встроенное определение найдено, вызов функции будет "заменен" встроенным определением функции.
Не могли бы вы подробно рассказать мне о процессах компиляции и связывания, которые приведут нас к выводу 500,6,700
. Я могу понять выход 6.