在gcc命令行,我要定義一個字符串,如-Dname=Mary
,然後在源代碼中我想printf("%s", name);
打印Mary
。
我該怎麼辦?如何在gcc命令行中定義字符串字面值?
回答
兩個選項。首先,逃避引號,以便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將愉快地評估到一個宏的最終定義。
非常感謝你的亞瑟。你必須是C的專家。 進一步的問題: 我推薦第二個選項。當我使用STRINGIZE_VALUE_OF(名稱)時,它將其轉換爲「1」,如果我有gcc -Dname = Mary-DMary。無論如何,讓海灣合作委員會停止interprite瑪麗 – richard 2010-03-09 19:24:51
理查德,經過多次審查,我不相信我可以想出一個方法,在上面的例子。不幸的是,你的選擇沒有擴展(例如給你「名字」)和完全擴展(例如,如果Mary被定義爲1,則名稱 - > Mary-> 1)。根據你的確切用法情況,可能有辦法解決這個問題 - 例如,如果瑪麗可以成爲一個const int而不是一個定義。 – 2010-03-10 02:53:45
再次感謝。我會先選擇第一個選項。 – richard 2010-03-10 16:25:16
避免殼「吃」的報價和其他字符,你可以嘗試單引號,像這樣:
gcc -o test test.cpp -DNAME='"Mary"'
這種方式,你有完全控制什麼被定義(行情,空格,特殊字符,和所有)。
我迄今發現大多數便攜式的方式是使用\"Mary\"
- 它會工作不僅與海灣合作委員會,但與任何其他C編譯器。例如,如果您嘗試在Microsoft編譯器中使用/Dname='"Mary"'
,它將停止並出現錯誤,但/Dname=\"Mary\"
將起作用。
在Ubuntu中,我使用定義CFLAGS的別名,CFLAGS包括限定一個字符串宏,然後我用在一個Makefile CFLAGS。我不得不逃避雙引號字符和\字符。它看起來是這樣的:
CFLAGS='" -DMYPATH=\\\"/home/root\\\" "'
只有實際工作的解決方案 – Cyan 2017-04-10 20:52:03
有時候,單個轉義和包裝在單引號中都不起作用,但是確實如此。其他時候,它沒有。 我覺得不同的是標誌是否加上引號總: '1)定義= -DLOGPATH = \ 「./日誌文件\」 CFLAGS = $ -v(定義)......' '2 )DEFINES = -DLOGPATH = \\\「./logfile \\\」 CFLAGS =「-v $(DEFINES)....」' 使用-v編譯器選項可以查看預處理器在做什麼。 – JasonDiplomat 2017-12-15 12:13:16
FYI:顯然,即使不同版本的同一系統上的相同工具鏈的不同可以採取行動,這方面... (如,它會似乎這將是一個外殼問題,但顯然它不僅限於殼)。
下面我們就xc32-GCC 4.8.3與(AVC-)使用相同的生成文件和main.c中,唯一的區別在於'make CC=xc32-gcc'
等
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
(感謝您的回答小號這裏的幫助下,順便說一句)。
這是我的解決方案爲:-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";
- 1. 在qmake命令行中定義一個字符串
- 2. 如何在命令行中執行vim宏字符串?
- 3. 如何通過字符串正確處理自定義命令?
- 4. 如何將一系列bash命令定義爲字符串?
- 5. 如何在BASH中執行命令字符串?
- 6. 如何在變量中執行字符串命令?
- 7. 如何在命令行中寫入插入字符串
- 8. 如何在haskell中定義字符串
- 9. 如何定義字符串
- 10. SQLite在單行命令中定義輸出字段分隔符
- 11. 元字符在命令行
- 12. 在C中比較字符串文字命令行參數
- 13. 如何編輯在命令行中指定的字符串中的某些字符在java中
- 14. 定義字符串,多行
- 15. 命令提示符中的自定義命令/關鍵字
- 16. 在find命令中使用字符串
- 17. 在doBy命令中使用字符串
- 18. 字符串命令在SQL中失敗?
- 19. 多行C#插值字符串字面
- 20. 從命令行解密GPG字符串
- 21. 解析命令行參數字符串
- 22. 命令行字符串變量比較
- 23. 執行字符串命令 - 巴什
- 24. Weka命令行和字符串
- 25. Base64編碼「字符串」 - 命令行Windows?
- 26. 命令行匹配部分字符串
- 27. C:命令行參數與字符串
- 28. AWK - 執行字符串作爲命令?
- 29. Sed命令替換字符串行
- 30. 觀察字符串命令行
我強烈建議您使用全部大寫('-DNAME = \「瑪麗\」')爲您要去令牌def這樣,它們就像其他的宏一樣。 – 2010-03-09 17:22:31
字符串問題宏:http://stackoverflow.com/questions/240353/convert-a-preprocessor-token-to-a-string – 2015-10-06 19:37:18