如何解决extern声明引用哪个命名空间?
我发现Qt中Q_INIT_RESOURCE()
宏的行为不一致,如果使用GCC进行编译,它可能会失败。
考虑代码:
do {
extern void func();
func();
}
while(false);
在这里,我们声明一个外部函数并调用它:到目前为止一切顺利。那是宏在后台使用的方法。现在,让我们尝试从两个不同的函数调用此代码,一个函数在一个命名空间中,另一个在全局命名空间中:
void funcGlobal() {
do {
extern void func();
func();
}
while(false);
}
namespace ns {
void funcNamespace() {
do {
extern void func();
func();
}
while(false);
}
}
void func() { std::cout << 1; }
namespace ns {
void func() { std::cout << 2; }
}
如我所见,MSVC在两种情况下都调用::func()
,但是GCC从全局函数中调用::func()
,从ns::func()
中调用functionNamespace
。凭直觉我发现MSVC更一致,但是我的问题是:标准说了什么,哪个编译器是正确的?
关于宏:由于上述问题,从不在全局名称空间中的任何函数调用宏Q_INIT_RESOURCE()
都会导致编译器错误。我必须使用附加的间接级别来解决此问题,将宏的用法包装到全局函数中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。