2010-11-22 63 views
2

這裏是什麼,我試圖做一個過於簡化的版本:如何將#defined字符串插入到system()命令中? (win32)中

#define LOGDIRECTORY C:\\logs\\ 
system("mkdir LOGDIRECTORY"); 

但是預處理器,而不是換出定義的名稱不是。相反,系統命令實際上認爲LOGDIRECTORY是名稱,因此在啓動程序時向我發送錯誤。

我知道這是錯誤的,必須有一些我可以用"標記或其他字符來指定我想要的,但我無法弄清楚。我不想對目錄和文件名進行硬編碼,因爲有人可能會在將來改變它們,並且比整個函數更改定義要容易得多。

PS,我在plain C

回答

9
#define LOGDIRECTORY C:\\logs\\ 
#define DEF2STR(x) #x 
system("mkdir " DEF2STR(LOGDIRECTORY)); 
#define LOGDIRECTORY_WITH_QUOTES "C:\\logs\\" 
system("mkdir " LOGDIRECTORY_WITH_QUOTES); 

在C語言中,可以通過編寫兩個字符串文字來完成簡單的字符串連接,其中沒有操作符。 "A" "B"將在編譯時轉換爲"AB"。您也可以使用它將長字符串拆分爲多行。

printf("a very long " 
"string indeed"); 

要轉換的定義到一個適當的字符串,在宏中使用井號(#)或跳過整個事情,包括在定義本身的報價。

+0

謝謝!我認爲這是一個完美的解決方案! – 2010-11-22 15:06:48

+0

像魅力一樣工作,謝謝! – 2010-11-22 16:34:09

1

如果您使用GCC進行編譯,您將別無選擇,只能使用引號來包裝定義,因爲最終的尾部反斜槓將被解釋爲行延續字符,並且如果它本身不會導致錯誤,倒數第二個反斜槓可能會引發錯誤。但是,如果您選擇僅刪除尾部反斜槓,則仍然需要使用兩個級別的字符串化宏,否則您的syscal將是「mkdir LOGDIRECTORY」。見http://gcc.gnu.org/onlinedocs/cpp/Stringification.html

所以上面的例子將成爲:

#define LOGDIRECTORY C:\\logs 
#define DEF2STR(x) #x 
#define STR(x) DEF2STR(x) 
system("mkdir " STR(LOGDIRECTORY)); 
相關問題