2012-10-11 54 views
3

這是我的第一篇文章,所以如果我太模糊或提供的信息,每個人都會直觀地假設,請讓我知道。Stringify C預處理

我很新,寫在C,我只是想更好地瞭解預處理。我在寫一個簡單的程序,可以直接從控制檯使用gcc -Wall -std=c99 -DSEED=argument接受參數,其中我的參數應該是一個整數,或者如果未定義-D,用戶將輸入它。

SEED值僅用於srand()。我很困惑,爲什麼我的代碼不會編譯,如果我把-DSEED=a作爲我的參數,而如果我把它編譯爲-DSEED=1。我得到一個「未聲明的(首次在這個函數中使用)」的錯誤,真的不明白兩者之間的區別。我認爲#define匹配變量類型與輸入,所以如果我把一個「a」#SEED將是一個字符,如果我把一個「1」#SEED將是一個int。

如果未定義SEED,我正在使用#ifndef SEED命令,這很有效。 我想我應該「輸入」輸入SEED然後可以檢查它是否是整數。閱讀一些文章在網上後,我想要使用:

#ifndef SEED 
    //code 
#else 
    #define TO_STRING(input) #input 
    char c; 
    c = TO_STRING(SEED) 
    //Then I was going to use c to figure out if it was an int. 
#endif 

這是行不通的,任何人都能夠指出你認爲我可能將不勝​​感激任何誤解。

編輯 - 所以我弄清楚爲什麼我在嘗試-DSEED=a時收到錯誤消息,因爲它是將它作爲變量讀取的。

+2

其中之一,字符不能被分配一個字符串文字。 – chris

回答

6

爲一個字符串化你#define需要使用一個兩步走的方法:

#define _STRINGIFY(s) #s 
#define STRINGIFY(s) _STRINGIFY(s) 

... 

#define SEED 123 

... 

const char * pszSeed = STRINGIFY(SEED); /* 'pszSeed' would point to "123" form here on. */ 

如果你只想用一個字簡單地通過*pszSeedpszSeed[0]訪問它。

+0

這絕對有效!非常感謝。你能否告訴我,我的思維方式是否正確,爲什麼它真的有效?所以第一個_STRINGIFY將會因爲「#」而將任何東西變成一個字符串,第二個STRINGIFY會將一個擴展的宏放入第一個#define中?最終隨訪。我只能在宏中使用#來創建一個字符串嗎?非常感謝你的幫助! – michaelp