以下示例编译(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函数inner而不是
答案 0 :(得分:3)
函数名称是标识符,标识符需要以非数字开头(§2.11):
identifier:
identifier-nondigit
identifier identifier-nondigit
identifier digit
答案 1 :(得分:3)
我不知道答案,但我相信我们可以通过谷歌搜索来找到它......
查看MSDN,我找到了两个链接:
__noop
:http://msdn.microsoft.com/en-us/library/s6btaxcs.aspx 第二个链接解释了__noop
__ noop内部指定应忽略函数并解析参数列表但不为参数生成代码。它适用于采用可变数量参数的全局调试函数。
示例显示__noop
对于调试代码确实非常有趣:
#if DEBUG
#define PRINT printf_s
#else
#define PRINT __noop
#endif
int main() { PRINT("\nhello\n"); }
同一页面上的另一条评论提供了0
函数的历史提示:
编译器在编译时将__noop内在函数转换为0。
我想,曾几何时,此扩展名称为0
,而不是__noop
,之后,Microsoft创建了__noop
关键字,因为它更容易搜索,比0
这个东西更具可读性,更少“奇怪”,并且明确标记为扩展名(由于两个主要下划线,如MSVC的__declspec
或gcc的__attribute__
)。
0
__noop