Исходный код:
файл a.c:
#include "c.h"
int main(){
struct struct_h test;
func_test(&test);
return 0;
}
файл b.c:
#include "c.h"
void func_test(struct struct_h *test){
test->test=0;
return;
}
файл c.h:
struct struct_h{
int test;
} struct_h;
void func_test(struct struct_h *test);
Компилировать: gcc a.c b.c -o a.out
или clang a.c b.c -o a.out
Начиная с GCC версии 10 стало:
/bin/ld: /tmp/ccDFtToH.o:(.bss+0x0): повторное определение «struct_h»; /tmp/ccDWcSDH.o:(.bss+0x0): здесь первое определение
collect2: error: ld returned 1 exit status
В clang нет ошибок, во всех прошлых версиях gcc, я проверял начиная с gcc 5.4 до gcc9, тоже нет обшибок.
Очевидный фикс это добавить typedef
для структуры в c.h, просто интересно кто прав в этой ситуации.