2

The following example compiles (VS2010 C++ compiler issues a warning C4353 though) and expression (*) evaluates to 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
}

Is using 0 as a function name allowed/regulated by C++ standard or its resolution is compiler-specific? I was looking in the N3242 draft but could not find anything related to this. Microsoft compiler obviously resolves such construct (or one with __noop) as an integer with value 0.

warning C4353:

warning C4353: nonstandard extension used: constant 0 as function expression. Use __noop function intrinsic instead

4

2 回答 2

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,后来微软创建了这个__noop关键字,因为它比这个东西更容易搜索,更易读,不那么“奇怪” 0,并且清楚地标记为扩展(因为两个前导下划线,例如 MSVC's__declspec或 gcc's __attribute__)。

结论:怎么0办?

  • 这是一个扩展名(根据警告消息)
  • 这是一个历史性的,已弃用的扩展
  • 它的使用已被弃用,取而代之的是__noop
  • 至少在 VC++2003 时(如果不是之前),它已被弃用
于 2012-04-19T13:01:42.840 回答
3

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

identifier:
    identifier-nondigit
    identifier identifier-nondigit
    identifier digit
于 2012-04-19T12:37:40.487 回答