【发布时间】:2020-02-24 20:11:42
【问题描述】:
这里我有一个示例项目,有两个源文件和一个头文件,如下:
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 这样的其他编译器进行了同样的尝试,并且发生了同样的情况。我可能在这里遗漏了一些愚蠢的东西。
【问题讨论】:
-
如果我在包含的文件 'personal.h' 中声明一个 const 变量或一个类,这个错误就会消失并编译。
-
This 解释了为什么它在 C++ 中不起作用。不确定 C 是否有相同的规则。
-
这能回答你的问题吗? What exactly is One Definition Rule in C++?
-
C 和 C++ 不同,也许这也不例外;)
-
在头文件中初始化该变量并在
C中重试链接。
标签: c++ c compilation include preprocessor