c++ - 在 C++ 中检测命名空间

标签 c++ namespaces language-lawyer

是否有可能检测您是否在给定的代码点处在命名空间中?特别是,如果文件被包含在全局命名空间中,我想包含一个警告。

最佳答案

如果 header 不包含在全局命名空间中,我可以给你一个生成编译错误的提示。如果我知道 C++ 构造肯定会生成编译器警告(除此之外的 #warning),那么可以使用它来代替编译错误。

放入你的标题:

template <class A, class B>
struct AreSame { enum { VALUE = -1 }; };
template <class A>
struct AreSame<A,A> { enum { VALUE = 1 }; };

struct TestGlobalNamespace
{
   int test_namespace[AreSame<TestGlobalNamespace, ::TestGlobalNamespace>::VALUE];
};

当您的 header 包含在某些命名空间中时,您会收到错误消息。

就像这个例子:

namespace Some {

struct TestGlobalNamespace
{
   int test_namespace[AreSame<TestGlobalNamespace, ::TestGlobalNamespace>::VALUE];
};

}

你会得到:

prog.cpp:17: error: size of array ‘test_namespace’ is negative

[更新]

但是越有可能出现这种错误:

prog.cpp:17: error: ‘::TestGlobalNamespace’ has not been declared
prog.cpp:17: error: template argument 2 is invalid

无论如何 - 没有人敢将您的 header 包含到全局以外的 namespace 中。

关于c++ - 在 C++ 中检测命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12410192/

相关文章:

验证具有错误域的帐户时,C++ LogonUser() API 速度很慢

c++ - qt中QGraphicsScene中的绘画

python - 给定一个描述 object.attribute 的 Python 字符串,如何将属性的命名空间与属性分开?

c# - 将相同的命名空间拆分到不同的程序集中有什么好的理由?

c++ - 是否允许编译器优化堆内存分配?

javascript - Javascript 中操作的执行顺序是否保证始终相同?

c++ - 将十六进制数的char[]转换为ascii表中十六进制数对应字母的char[]并取反

c++ - 我怎么知道 C++ 编译器是否生成线程安全的静态目标代码?

C++ 名称与 typedef 别名和继承名称的冲突

c++ - C++11 中的 POD 和继承。 struct的地址是否==第一个成员的地址?