1. 程式人生 > >由列舉引起的對編譯和巨集預編譯的理解思考

由列舉引起的對編譯和巨集預編譯的理解思考

話不多說,先上一段神奇的程式碼!

#include <stdio.h>
#include <stdlib.h>

enum t
{
    a,
    b,
};

int main()
{
    printf("b = %d\n", b);
    #if (b==0)
        printf("b=0\n");
    #elif (b==1)
        printf("b=1\n");
    #endif
    return 0;
}

猜,答案會是多少呢?

b = 1
b=0

Process returned 0 (0x0)   execution time
: 0.034 s Press any key to continue.

為啥,第二行那個會是0呢?

這就要說到寫這篇部落格的意義了,,關於預編譯和編譯了。

列舉成員的值是在,編譯階段確定的。而所有的巨集展開巨集替換是在預編譯階段進行的。所以此處犯了一個很大的錯誤。把列舉成員的值放在了巨集的預編譯下,因為預編譯是提前於編譯的,所以b被認為是0。

tips:
1、切記,不要把列舉的編譯時期才能確定變數的值放到巨集的預編譯。

2、列舉中變數以逗號結尾。