2010-10-18 60 views
3

在C++中的碼塊項目添加以下定義的項目設置,編譯器設置,#定義:-D選項選自G ++命令行錯誤地擴大

 
_DEBUG 
DATA_DIR=\"/media/Shared/SiX/Data\" 

這將產生以下的g ++命令行:

 
g++ -Wall -g -fPIC -save-temps -D_DEBUG -DDATA_DIR=\"/media/Shared/SiX/Data\" -I../Includes -c /media/Shared/SiX/SiXConfiguration/PathManager.cpp -o obj/Debug/PathManager.o 

此代碼不能編譯:

 
char* commonDataDir; 
#ifdef DATA_DIR 
commonDataDir = DATA_DIR; 
#endif 

看着準備rocessor輸出文件,我看到源代碼行以這種方式展開:

 
commonDataDir = /media/Shared/SiX/Data; 

我想到:

 
commonDataDir = "/media/Shared/SiX/Data"; 

相同的代碼是從Eclipse CDT的正確編譯:

 
g++ -D_DEBUG -DDATA_DIR=\"/media/Shared/SiX/Data\" -I"/media/Shared/SiX (copy)/Includes" -O3 -Wall -c -fmessage-length=0 -fPIC -ggdb -MMD -MP -MF"PathManager.d" -MT"PathManager.d" -o"PathManager.o" "../PathManager.cpp" 

因此,g ++協處理器對相同的命令行參數進行不同的處理。我怎樣才能解決這個問題?

回答

4

在宏上加引號是棘手的,不是一個好主意。
嘗試使用預處理器添加所需的引號。

#define DO_QUOTE(X)  #X 
#define QUOTE(X)   DO_QUOTE(X) 

#ifndef DATA_DIR 
#define DATA_DIR  /tmp 
#endif 

char commonDataDir[] = QUOTE(DATA_DIR); 
+1

謝謝,這個伎倆。 – 2010-10-18 13:25:46

0

您需要附上整個字符串中"

-DDATA_DIR="\"/media/Shared/SiX/Data\"" 
     ^      ^
+0

試過,給出了與我的版本相同的結果。 – 2010-10-18 13:24:32

0

這似乎解決它。

g++ -DDATA_DIR='"/media/Shared/SiX/Data"' ... 
+0

此更改提供「無輸入文件」g ++錯誤消息。 – 2010-10-18 13:25:16

2

代碼:: Blocks的項目構建選項 - >編譯器設置 - >#定義

DATA_DIR=\\"/media/Shared/SiX/Data\\" 

(這不只是一種猜測,但我經常這樣做)

相關問題