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 (将#修改为@)