【发布时间】:2019-08-19 14:38:57
【问题描述】:
我知道全局变量不应该在头文件中定义,我们应该使用extern 只在头文件中声明它们。
但我仍然尝试在以下标头 lib.h 中定义一个全局变量:
//lib.h
int i;
void add();
尝试在 C 和 C++ 中使用此标头时,我得到了一些有趣的结果
在 C 中,我在 main.c 和 lib.c 中包含了标头,它编译并运行得很好:
//main.c
#include <stdio.h>
#include <stdlib.h>
#include "lib.h"
int main()
{
printf("%d\n", i);
add();
printf("%d\n", i);
return 0;
}
----
//lib.c
#include "lib.h"
void add(){
i++;
}
但是当我在 C++ 中使用类似的代码运行它时(lib.h 和 lib.cpp 与上面相同),它给出了一个关于 i 具有多个定义的变量的错误消息:
//main.cpp
#include <iostream>
#include "lib.h"
using namespace std;
int main()
{
cout<<i<<endl;
add();
cout<<i<<endl;
return 0;
}
为什么它在 C 中编译而不是在 C++ 中?
【问题讨论】:
-
@Tzaulmen 我试过了,但它不起作用。
-
这在两种语言中都是无效的,但至少 gcc(在 C 模式下)默认允许它 - 你使用什么编译器?
-
@aschepler 无效?为什么?这是一个坏主意,但有效……您的意思是使用未初始化的变量吗?
-
@EugeneSh。我不了解 C,但在 C++ 中,它违反了单一定义规则。
-
标头被复制到 cpp 文件中(这就是 #include 所做的)。因此,如果将它包含在两个 cpp 文件中,则您刚刚定义了两个具有相同名称的不同全局变量。这实际上是您发布的错误消息,所以......这是一个很好的错误消息,一点也不奇怪。
标签: c++ c global-variables language-lawyer cross-language