零作为函数名称

时间:2012-04-19 12:23:24

标签: c++ function visual-c++ compiler-construction

以下示例编译(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而不是

2 个答案:

答案 0 :(得分:3)

函数名称是标识符,标识符需要以非数字开头(§2.11):

identifier:
    identifier-nondigit
    identifier identifier-nondigit
    identifier digit

答案 1 :(得分:3)

我不知道答案,但我相信我们可以通过谷歌搜索来找到它......

查看MSDN,我找到了两个链接:

第二个链接解释了__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
  • 至少在VC ++ 2003时间(如果不是之前)
  • 它已被弃用