Почему g cc игнорирует эти средства защиты заголовков в этой простой тестовой программе?
Файл заголовка:
#ifndef MYHEADER_H
#define MYHEADER_H
#warning "header declared"
int some_int=0;
#endif
И два. c файла: main . c:
#include "header.h"
int main ()
{
return some_int;
}
source. c:
#include "header.h"
int get_int()
{
return some_int;
}
При компиляции с:
gcc -o out main.c source.c
я получаю следующий вывод:
In file included from main.c:1:
header.h:4:2: warning: #warning "header declared" [-Wcpp]
4 | #warning "header declared"
| ^~~~~~~
In file included from source.c:1:
header.h:4:2: warning: #warning "header declared" [-Wcpp]
4 | #warning "header declared"
| ^~~~~~~
/usr/bin/ld: /tmp/ccmAbN1J.o:(.bss+0x0): multiple definition of `some_int'; /tmp/ccEd5PwN.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
Как и ожидалось, предупреждение появляется, когда компилятор впервые включает файл заголовка. Но почему охранники заголовков не останавливают второе включение?
Версия g cc:
gcc version 9.2.1 20200130 (Arch Linux 9.2.1+20200130-2)