2017-09-24 77 views
0

我有两个文件:如何在extern变量在其他文件中声明不同时使g ++生成警告?

a.cpp

#include <iostream> 

using namespace std; 

int a[100]; 

int main() { 
    cout << "Hello World" << endl; 
} 

b.cpp

#include <iostream> 

using namespace std; 

extern double a[50]; 

显然有 “一” 的两个文件有冲突的声明。但是当我运行时

g++ a.cpp b.cpp 

编译静静地成功。

有什么办法可以让g ++抱怨冲突(无论是通过警告还是错误)?

我试过了-Wshadow和-Wshadow-all标志。他们没有帮助。

+1

你试过-Wshadow? –

+0

另外,加上'-Wshadow = global','local'或'compatible-local',所以你可以根据需要对其进行微调。不过,不要全局使用名称空间。或者一般来说,理想情况下。 –

回答

2

检测此问题的一种方法是始终将extern声明放在标头(.h)文件中,并将该文件包含在定义这些变量的源模块中。

如果您创建了一个“a.h”文件,它可以包含在“a.cpp”和“b.cpp”中。接下来的编译会导致错误,因为类型在标头中的extern double a[50];声明和“a.cpp”中的int a[50];定义之间不匹配。

0

由于最近有足够多的gcc版本,您可以使用-flto标志来编译器和链接器。这将调用链接时优化,在某些情况下,它会捕获extern变量之间的类型不匹配。

您还可以通过确保在头文件中声明任何外部链接名称来避免此问题。如果extern double a[50];已出现在a.cppb.cpp包含的通用标题中,您将得到a.cpp的编译错误。

请注意,这不是“阴影”,这就是影子标志没有帮助的原因。当在名称已经存在于外部作用域的内部作用域中重新使用相同名称时void f() { int x; { double x; } }。但是,两个不同的翻译单位不是重叠范围。

0

从g ++“观点来看”并没有冲突。 变量double a[50]被限制在b.cpp文件中。由于a存在于a.cpp中,因此您错误地认为您正在使用相同的变量。在b.cpp的尝试a.cpp使用它 声明一个又一个,比方说,int b,链接器会抱怨:
b.cpp:

#include <iostream> 

using namespace std; 

extern char a[50]; 
extern int b; 

一个。CPP:

#include <iostream> 

using namespace std; 

int a[100]; 

int main() { 
    b=3; //using a variable unknown by this scope 
    cout << "Hello World" << endl; 
} 

编译时,你会得到:

g++ a.cpp b.cpp 
a.cpp: In function ‘int main()’: 
a.cpp:7:5: error: ‘b’ was not declared in this scope 
    b=3; 
    ^

全局变量默认有外部链接,那么该声明之前external是相当忽视,你有什么的声明另一个类型为double的变量。因此,对于链接器,double a[50]是一个与a.cpp中声明的变量完全分离的变量,因为它们处于分离的范围内,并且没有冲突,所以没有抱怨。

相关问题