语句:
#if (1, 2) != 2
#else
#endif为什么,一直不清楚为何Build不过???
理由是什么???
难道预编译指令不Support逗号表达式吗?

解决方案 »

  1.   

    楼主为什么会认为#if (1, 2) != 2 能编译通过呢?
    一般#if后边是一个宏或一个表达式。(1,2)!=2 是一个表达式吗?
      

  2.   

    if ((1, 2) != 2)
    {
       var++;
    }var = (1, 2) != 2;
    while ((1, 2) != 2)
    {
    }
    ...都可以通过编译
      

  3.   

    你这个问题很有意思
    “()”括号里面如果有多个表达式的话,他将被认为是一个函数,一个无名函数,返回值是最好一个表达式
    “()”括号内部如果只有一个表达式,他也是一个无名函数,返回值就是这个表达式而#if后面必须是一个常量表达式
    而(1,2)!=2这个不是一个常量表达式,可以认为他是一个无名函数的表达式。无名函数为“()”。
    #if (2)!=2 这个一样会报错,因为内部含有函数,不是常量表达式。
    #if 2!=2 这将不报错,因为这是一个常量表达式这个无名函数的功能是返回括号内部“()”的最后一个表达式。
    例: (1,2)返回值是2。 (1,2) !=2 相当于 2 !=2.
    再说一个例子。 
    c++中表达式, (1,2,3,4,5.0)返回值是多少?   返回值是 5.0 你可以将“()”看成一个函数,无名函数,返回值为最后一个表达式
      

  4.   

    编译不过才正确。表达式(1, 2) 并不是常量表达式。#if 后面必须跟的是一个常量表达式。虽然(1, 2) 里面都是常量,但是这种逗号操作符运算的表达式,C++并不把它看作常量表达式。判断是不是常量表达式 很简单。case 语句后面必须接一个常量表达式
    int i = 2;
    switch(i)
    {
    case (1, 2):  //语法错误
      break;
    }
    ----
    比如,一个整型的常量,如果被常量表达式初始化,那这个常量也是常量表达式
    const int a = 0; //文字常量是常量表达式,因此a就是常量表达式,这样a就可以当作编译期常量
    const int b = (1, 2); //b并不是常量表达式,不能当作编译期常量
    ----回到#if (1, 2) != 2的问题。
    这个预编译指令在 GCC 3.4.2能编译通过。所以有些编译器在某些方面对C++语言做了一点扩展。
      

  5.   

    我在完成一个类似C Language的Script language,目前QA测试过程中遇到这个问题,事实上大多数User不会这么用,因此也不是非常重要,只不过想知道是什么原因?现在在看标准C中,看看能不能找到答案。