2014-01-15 49 views
1

例如,這裏是一個ç共同#define的#define串數字定義

#define USERNAME_LEN 100 
#define SCAN_FMT "%100s" 

// str is input from somewhere 
char username[USERNAME_LEN + 1]; 
ret = sscanf(str, SCAN_FMT, username); 
// check ret == 1 ? 

我們可以有這樣的:

#define SCAN_FMT "%" USERNAME_LEN "s" 
當然

,這種語法不是我們想要,但最終目標 是混合數字#define成字符串#define

注:我知道我們可以做一些事情荷蘭國際集團這樣的:

sprintf(SCAN_FMT, "%%ds", USERNAME_LEN); // char SCAN_FMT[10]; 

但這不是我所期待的,因爲它需要運行時生成, 最好是立足於ANSI-C或std99。

+1

這個答案可以幫助你:http://stackoverflow.com/a/20642870/694576 – alk

回答

2

你可能會喜歡做這樣的:

#define SCAN_FMT_STRINGIFY(max) "%"#max"s" 
#define SCAN_FMT(max) SCAN_FMT_STRINGIFY(max) 

#define USERNAME_MAXLEN (100) 

... 

    char username[USERNAME_MAXLEN + 1] = ""; /* Add one for the `0`-terminator. */ 
    int ret = sscanf(str, SCAN_FMT(USERNAME_MAXLEN), username); 
2

您可以對這些類型的任務使用預處理器指令。

1.第一指令是#允許你做這樣的事情:

#define str(x) #x 
cout << str(test); 

這將被翻譯成:

cout << "test"; 

2,第二個指令是##:

#define glue(a,b) a ## b 
glue(c,out) << "test"; 

將被翻譯成:

cout << "test"; 

看看這裏的更多信息preprocessor

+0

有一塊失蹤。 OP想要在已被替代的**之後將定義的值串化爲**。 IIRC,這樣做需要第三個'#define'。 –

+2

對於你的回答來說並不重要,但問題是標記爲C並且沒有C++。 –