命名空间范围内的外部 - GCC vs clang vs msvc
extern in namespace scope - gcc vs clang vs msvc
我已经用最新的gcc
、clang
和MSVC
测试了下面看似奇怪的代码示例;clang和gcc都会给出链接错误,但MSVC编译和链接没有任何问题。哪一个是正确的?
// foo.h
#pragma once
namespace A
{
class foo
{
public:
foo();
void print();
};
}
<小时 />// foo.cpp
#include <iostream>
#include "foo.h"
int* p = nullptr;
using namespace A;
foo::foo()
{
p = new int(5);
}
void foo::print()
{
extern int* p;
std::cout << *p;
}
<小时 />#include "foo.h"
int main()
{
A::foo f;
f.print();
}
gcc 和 clang
:
foo.cpp:(.text+0x35): undefined reference to 'A::p'
GCC 和 Clang 都符合标准。示例和解释在标准 [basic.namespace]/4 中给出:
声明的封闭命名空间是声明在词法上出现的那些命名空间,除了在其原始命名空间之外重新声明命名空间成员(例如,[namespace.memdef] 中指定的定义(。此类重新声明具有与原始声明相同的封闭命名空间。 [ 示例:
namespace Q {
namespace V {
void f(); // enclosing namespaces are the global namespace, Q, and Q::V
class C { void m(); };
}
void V::f() { // enclosing namespaces are the global namespace, Q, and Q::V
extern void h(); // ... so this declares Q::V::h
}
void V::C::m() { // enclosing namespaces are the global namespace, Q, and Q::V
}
}
— 结束示例]
相关文章:
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc
- 命名空间范围内的外部 - GCC vs clang vs msvc
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 与clang++一起使用的VS代码在构建良好的C++文件中显示错误
- constexpr 函数的常量引用参数:gcc/msvc vs clang/icc
- 使用函数参数作为常量表达式的一部分 - gcc vs clang
- `noexcept`函数中的std :: terminate`调用函数有限-GCC vs clang codegen
- 函数指针的模板参数推导(g++ & ICC vs Clang++ & VC++)
- GCC vs CLANG:除了静态强制转换时在未使用的模板专用化中解析外,否
- GCC vs CLANG:将捕获的参数包扩展两次
- GCC vs Clang 中的堆栈粉碎(可能是由于金丝雀)
- "Nested" 带括号的类模板参数推导:GCC vs. clang
- GCC vs Clang:将功能与-FPIC一起插入
- cppcheck vs clang整洁:显式构造函数initializer_list
- GCC vs. Clang:"invalid use of incomplete type" std::d eclval 和模板专业化
- 默认参数,gcc vs clang
- GCC vs clang -使用' make_overload '可变lambda继承时的模糊重载
- LLVM vs clang on OS X