【发布时间】:2011-09-22 07:50:20
【问题描述】:
可以编写一个函数,使用 C 编译器编译时返回 0,使用 C++ 编译器编译时返回 1(与
#ifdef __cplusplus 没意思)。
例如:
int isCPP()
{
return sizeof(char) == sizeof 'c';
}
当然,上述方法只有在sizeof (char) 与sizeof (int) 不同时才有效
另一个更便携的解决方案是这样的:
int isCPP()
{
typedef int T;
{
struct T
{
int a[2];
};
return sizeof(T) == sizeof(struct T);
}
}
我不确定这些示例是否 100% 正确,但您明白了。我相信还有其他方法可以编写相同的函数。
在运行时可以检测到 C++03 和 C++11 之间的哪些差异(如果有)?换句话说,是否可以编写一个类似的函数,该函数将返回一个布尔值,指示它是由符合 C++03 编译器还是由 C++11 编译器编译的?
bool isCpp11()
{
//???
}
【问题讨论】:
-
这个练习的意义何在?首先,您确实有一个宏,其次,编译器开始实现 C++0x 的所有功能需要数年时间,同时它将是一个混合体。所以唯一合理的测试是编译器一个版本宏。
-
这符合不是一个真正的问题,但遵循规则似乎太有趣了!
-
@Gene 等人:您是否对所有有趣但看不到实用“要点”的问题投反对票?
-
“我们希望答案通常涉及事实、参考资料或特定专业知识”。我认为这个问题符合这些期望,投票支持重新开放。
-
@sixlettervariables:虽然措辞可能更好,但在我看来,这个问题的基本概念(如果有的话,C++03 和 C+ +0x 可以在运行时检测到?)是完全合法的。鉴于代码必须在两者中编译和执行,它也可以被表述为关于 C++0x 中的重大变化。在我看来,这也是一个完全合理的问题。
标签: c++ c++11 c++03 language-detection