2010-03-09 80 views
52

在gcc命令行,我要定義一個字符串,如-Dname=Mary,然後在源代碼中我想printf("%s", name);打印Mary
我該怎麼辦?如何在gcc命令行中定義字符串字面值?

+6

我強烈建議您使用全部大寫('-DNAME = \「瑪麗\」')爲您要去令牌def這樣,它們就像其他的宏一樣。 – 2010-03-09 17:22:31

+0

字符串問題宏:http://stackoverflow.com/questions/240353/convert-a-preprocessor-token-to-a-string – 2015-10-06 19:37:18

回答

61

兩個選項。首先,逃避引號,以便shell不會吃他們:

gcc -Dname=\"Mary\" 

或者,如果你真的想-Dname =瑪麗,你可以stringize它,雖然這是一個有點哈克。

#include <stdio.h> 

#define STRINGIZE(x) #x 
#define STRINGIZE_VALUE_OF(x) STRINGIZE(x) 


int main(int argc, char *argv[]) 
{ 
    printf("%s", STRINGIZE_VALUE_OF(name)); 
} 

請注意,STRINGIZE_VALUE_OF將愉快地評估到一個宏的最終定義。

+0

非常感謝你的亞瑟。你必須是C的專家。 進一步的問題: 我推薦第二個選項。當我使用STRINGIZE_VALUE_OF(名稱)時,它將其轉換爲「1」,如果我有gcc -Dname = Mary-DMary。無論如何,讓海灣合作委員會停止interprite瑪麗 – richard 2010-03-09 19:24:51

+0

理查德,經過多次審查,我不相信我可以想出一個方法,在上面的例子。不幸的是,你的選擇沒有擴展(例如給你「名字」)和完全擴展(例如,如果Mary被定義爲1,則名稱 - > Mary-> 1)。根據你的確切用法情況,可能有辦法解決這個問題 - 例如,如果瑪麗可以成爲一個const int而不是一個定義。 – 2010-03-10 02:53:45

+0

再次感謝。我會先選擇第一個選項。 – richard 2010-03-10 16:25:16

23

避免殼「吃」的報價和其他字符,你可以嘗試單引號,像這樣:

gcc -o test test.cpp -DNAME='"Mary"' 

這種方式,你有完全控制什麼被定義(行情,空格,特殊字符,和所有)。

我迄今發現
5

大多數便攜式的方式是使用\"Mary\" - 它會工作不僅與海灣合作委員會,但與任何其他C編譯器。例如,如果您嘗試在Microsoft編譯器中使用/Dname='"Mary"',它將停止並出現錯誤,但/Dname=\"Mary\"將起作用。

4

在Ubuntu中,我使用定義CFLAGS的別名,CFLAGS包括限定一個字符串宏,然後我用在一個Makefile CFLAGS。我不得不逃避雙引號字符和\字符。它看起來是這樣的:

CFLAGS='" -DMYPATH=\\\"/home/root\\\" "' 
+0

只有實際工作的解決方案 – Cyan 2017-04-10 20:52:03

+1

有時候,單個轉義和包裝在單引號中都不起作用,但是確實如此。其他時候,它沒有。 我覺得不同的是標誌是否加上引號總: '1)定義= -DLOGPATH = \ 「./日誌文件\」 CFLAGS = $ -v(定義)......' '2 )DEFINES = -DLOGPATH = \\\「./logfile \\\」 CFLAGS =「-v $(DEFINES)....」' 使用-v編譯器選項可以查看預處理器在做什麼。 – JasonDiplomat 2017-12-15 12:13:16

0

FYI:顯然,即使不同版本的同一系統上的相同工具鏈的不同可以採取行動,這方面... (如,它會似乎這將是一個外殼問題,但顯然它不僅限於殼)。

下面我們就xc32-GCC 4.8.3與(AVC-)使用相同的生成文件和main.c中,唯一的區別在於'make CC=xc32-gcc'

GCC 4.7.2(和 幾個人)

CFLAGS += -D'THING="$(THINGDIR)/thing.h"'一直在使用上幾年許多版本的gcc(和bash)的。

爲了使與xc32-GCC這種兼容(而在另一個評論聲稱\」是不是更便攜「「的光),以下必須完成:

CFLAGS += -DTHING=\"$(THINGDIR)/thing.h\" 

ifeq "$(CC)" "xc32-gcc" 
CFLAGS := $(subst \",\\\",$(CFLAGS)) 
endif 

做的事情真的混亂中發現這個:顯然是一個不帶引號-D,並在最後一個//導致的#define 與評論 ...如

THINGDIR=/thingDir/ - >#define /thingDir//thing.h - >#define /thingDir

(感謝您的回答小號這裏的幫助下,順便說一句)。

-1

這是我的解決方案爲:-DUSB_PRODUCT=\""Arduino Leonardo\""
我用它在生成文件用:
GNU請3.81(來自的GnuWin32)

AVR-G ++(AVR_8_bit_GNU_Toolchain_3.5.0_1662)4.9.2

在預編譯的文件(-E選項G ++),結果是:
const u8 STRING_PRODUCT[] __attribute__((__progmem__)) = "Arduino Leonardo";