Здесь у меня есть пример проекта с двумя исходными файлами и файлом заголовка, следующим образом:
main.c:
#include<stdio.h>
#include "personal.h"
int main(){
i = 5;
printf("Value is %d\n",i);
return 0;
}
sub.c:
#include "personal.h"
// do nothing
и, наконец, personal.h:
#pragma once
int i;
Каждый из .c-файлов включает в себя personal.h, который "охраняется". Я компилирую с gcc, все идет хорошо:
>gcc sub.c main.c -o out
>./out
Value is 5
Но с g ++ это происходит:
>g++ sub.c main.c -o out
/tmp/cctYwVnO.o:(.bss+0x0): multiple definition of `i'
/tmp/ccPElZ27.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
Есть ли что-нибудь принципиально различное между C ++ и C с точки зрения того, как связаны файлы, препроцессорная активность и т. д.? Я попробовал то же самое с другими компиляторами, такими как clang, и то же самое происходит. Возможно, мне здесь не хватает чего-то глупого.