【发布时间】:2012-04-30 23:06:33
【问题描述】:
以下示例编译(尽管 VS2010 C++ 编译器发出警告 C4353)并且表达式 (*) 计算结果为 0:
#include <iostream>
#include <string>
int main()
{
0(1, "test"); // (*) - any number and type of arguments allowed
int n = 0(1, "test"); // 0
std::string str(0(1, "test")); // Debug assertion fails - 0 pointer passed
}
是使用 0 作为 C++ 标准允许/规定的函数名称,还是它的解析是特定于编译器的? 我正在查看 N3242 草案,但找不到与此相关的任何内容。 Microsoft 编译器显然将此类构造(或带有__noop 的构造)解析为值为0 的整数。
警告 C4353:
警告 C4353:使用了非标准扩展:常量 0 作为函数 表达。改用 __noop 函数内在函数
【问题讨论】:
-
我认为这不应该编译,函数名不能以数字开头
-
这可能是一些愚蠢的 MSVC 东西,具有特定的、模糊的目的。它不能在 GCC 中编译(从警告中可以看出)。
-
嗯...“使用的非标准扩展”的哪一部分让您相信标准可能允许该构造?
-
@n.m.呃,我忽略了那个明显的暗示。谢谢!
-
@chris : 让我看看... gcc 添加了一个非标准扩展名(例如
__attributes__),这是一件好事。 MSVC自己加了,就哑?断言你一无所知的东西一定是哑有逻辑吗?
标签: c++ function visual-c++ compiler-construction