2015-08-20 60 views
0

我不是程序員,但我需要這樣做! :)我的問題是我需要定義一些常量來設置或不設置我的代碼的某些特定部分,並且最好使用#define而不是正常變量。代碼是波紋管。根據之前所做的字符串比較,isample可以等於0,1,2或3。假設isample = 1,那麼代碼輸出常量SAMPLE等於1,但是它會進入if isample == 0!定義有問題。發生什麼事?還有另一種方法可以做到嗎?testing #define CONSTANT

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

int main() 
{ 

    int isample = 1; 

#define SAMPLE isample 
    printf("\nSAMPLE %d", SAMPLE); 

#if SAMPLE == 0 
#define A 
#define AA 
    printf("\nA"); 
#elif SAMPLE == 1 
#define B 
    printf("\nB"); 
#elif SAMPLE == 2 
#define C 
    printf("\nC"); 
#else 
    printf("\nOTHER"); 
#endif 

    printf("\nBye"); 
} 

結果:

SAMPLE 1 
A 
Bye 

我也試過:

#define SAMPLE 4 
#undef SAMPLE 
#define SAMPLE isample 

,結果是一樣的。

我也試過使用變量。除了使用#if塊的,我用if

if (SAMPLE == 0) 
    { 
#define A 
#define AA 
     printf("\nA"); 
    } 
    else if (SAMPLE == 1) 
    { 
#define B 
     printf("\nB"); 
    } 
    else if (SAMPLE == 2) 
    { 
#define C 
     printf("\nC"); 
    } 
    else 
    { 
     printf("\nOTHER"); 
    } 
    int abc, def; 
#ifdef A 
    abc = 1; 
    def = 2; 
#endif 
#ifdef B 
    abc = 3; 
    def = 4; 
#endif 
#ifdef C 
    abc = 5; 
    def = 6; 
#endif 

    printf("\nabc %d, def %d\n", abc, def); 

結果:

SAMPLE 1 
B 
abc 5, def 6 

因此,所有的#define的被定義,不僅是選擇一個,這將是BA, B and C定義了在同一組變量中工作的代碼的一部分。我需要根據isample設置其中之一。

+2

宏的處理。他們不能訪問普通的變量值。 – Barmar

+0

@JensGustedt定義了'A'和'AA','B'和'C'不是。未定義的標記被'0'替換爲'#if'中的表達式評估目的 –

+0

所以要做我想做的事情,我有兩個選擇: 1)每次定義「SAMPLE」時,我運行代碼; 2)使用正常變量,並取消所有我定義的「常量」。 我正在做選項1,但是我已經遇到了一些問題,當我忘記更改它時,並且由於代碼需要很長時間才能運行,最好確保它能做正確的事情。我想我會選擇選項2並重寫代碼... – Thaise

回答

2

您正在使用錯誤的方法來處理它。在運行時確定isample的值,而不是編譯時間。

當您使用

#define SAMPLE isample 

到處編譯器看到SAMPLE作爲標記,它由isample替換令牌。這不是你想要的。您希望編譯器將所有SAMPLE替換爲值isample

您需要使用編譯器標誌來設置值SAMPLE。與海灣合作委員會,你可以使用:

gcc -DSAMPLE=1 ... 

和刪除線的時候,程序編譯,而不是在它的運行

#define SAMPLE isample 
+0

你是對的,但isample會在每次運行代碼時改變。我不想把它「手工」(我到現在爲止所做的)。所以也許最好的方法是不使用#define並使用變量重寫所有這些部分。:/ – Thaise

+0

@Thaise,如果您想要在運行時根據'isample'的值更改要執行的代碼分支,則需要使用'if-else'塊,而不是'#if SAMPLE == xxx'塊。 –

+0

但是,如果我在上面的代碼中使用'if-else'塊,所有'#define X'將被定義,而不僅僅是'if'選擇的那個。問題是A,B和C定義了在同一組變量中工作的部分代碼。我需要根據'isample'設置其中的一個。 – Thaise