当外部变量在其他文件中声明不同时,如何使G 产生警告
How to make g++ generate warning when extern variable declared differently in other file?
我有两个文件:
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];
显然,两个文件中有" A"的冲突声明。但是当我运行
时g++ a.cpp b.cpp
汇编默默成功。
有什么办法可以使G 抱怨冲突(通过警告或错误)?
我尝试了-wshadow和-wshadow -all标志。他们没有帮助。
检测到这一点的一种方法是将extern
声明始终放入标题(.h
)文件中,并将此文件包括在定义这些变量的源模块中。
如果创建一个" A.H"文件,则可以将其包含在" A.CPP"answers" B.CPP"中。随后的编译将导致错误,因为类型在标题中的extern double a[50];
声明与" A.CPP"中的int a[50];
定义之间不匹配。
使用GCC的最新版本,您可以将-flto
标志使用到编译器和链接器。这会调用链接时间优化,在某些情况下确实会捕获extern
变量之间的类型不匹配。
您还可以通过确保在标题文件中声明任何外部链接的名称来帮助避免此问题。如果extern double a[50];
出现在a.cpp
和b.cpp
包含的通用标题中,您将获得a.cpp
的汇编错误。
请注意,这不是"阴影",这就是为什么影子标志没有帮助的原因。阴影是当您在内部范围内重复使用相同名称的时候,该名称已经存在于外部范围中的名称,例如void f() { int x; { double x; } }
。但是,两个不同的翻译单元不是重叠的范围。
从g "观点"观点"没有冲突。可变double a[50]
在B.CPP文件中受到约束。由于a
存在于A.CPP中,因此您使用同一变量的错误感知。在B.CPP中声明另一个int b
,请尝试在A.CPP中使用它,链接器将投诉:
B.CPP:
#include <iostream>
using namespace std;
extern char a[50];
extern int b;
A.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中声明的变量完全分开的,因为它们处于分离范围,没有冲突,因此没有投诉。
- 如果出现警告,如何立即使自动测试失败
- 如何使 Visual Studio 2010 警告未使用的变量
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告
- 如何使我的C 编译器发出constexpr值(例如警告?)
- 如何使编译器在实例变量未初始化时C++生成错误或警告
- 当外部变量在其他文件中声明不同时,如何使G 产生警告
- 为什么当对象std ::向量被声明但从未使用时,编译器不会发出警告
- C++ 虚拟函数,参数在未使用时收到警告
- 使用Boost :: black在boost :: variant中使用时,请警告编译器
- 如何使g++为int i=i生成错误/警告
- 如何使编译器在 const 未一致使用时至少发出警告
- 使g++指出这个错误/警告
- 如何使GCC的长整型常量警告静音
- 如何使Clang忽略特定块中的特定警告
- 警告:指针和整型之间的比较,传递' read '的参数1使指针的整型没有强制转换
- 如何使g++引起异常而不是对格式错误发出警告
- 在Microsoft Visual c++ 2015中编译DLL -警告C4251需要有DLL接口供类的客户端使用-当使
- 这个backward_warning. h#警告从何而来?
- 当我向只接受无符号整数的函数提供有符号整数时,是否有一种方法可以使GCC警告我?
- 如何使警告'The last statement should return a value'静音?