[英]Variables conflict between Makefile and C code
在我的C Makefile中,有以下幾行:
ifeq ($(VERBOSE_PRINT), TRUE)
CFLAGS += -D TRUE
else
CFLAGS += -D FALSE
endif
如您所知,此標志指示我是否應該打印調試語句。
在我的C代碼的其他地方,我正在使用定義TRUE和FALSE
#define FALSE 0
#define TRUE !FALSE
然后,當我嘗試編譯代碼時,出現以下錯誤:
types.h:6:0: error: "FALSE" redefined [-Werror]
#define FALSE 0
<command-line>:0:0: note: this is the location of the previous definition
如果我從C代碼中刪除TRUE和FALSE的定義,那么我的程序會發瘋。
發生了什么事,我該如何解決此沖突?
謝謝你
對於兩個不同的不兼容事物,您不能使用相同的名稱,因此您需要更改其中之一。 因為您沒有任何意義,所以很可能您想更改Makefile。 就像是:
ifeq ($(VERBOSE_PRINT), TRUE)
CFLAGS += -DDEBUG=1
else
CFLAGS += -DDEBUG=0
endif
然后,在您的C代碼中,您可以擁有
#if DEBUG
printf( ... debugging messages ... )
#endif
在編譯器命令行上, -DXYZ
等效於-DXYZ=1
(POSIX c99
)。 這意味着在命令行上使用-DFALSE
可以同時得到#define FALSE 1
和#define FALSE 0
,這是非良性的重定義。 宏的良性重定義是可以的(這意味着替換令牌的順序在當前定義和新定義中都相同-參見C11§6.10.3宏替換¶1-2 )。
您需要在代碼中使用其他變量來決定是否進行打印:
#ifdef VERBOSE_PRINT
printf("Debugging!\n");
#endif
然后,可以在命令行上使用-DVERBOSE_PRINT
啟用打印,而將其保留以禁用打印。 或者,您可以使用:
#if VERBOSE_PRINT
printf("Debugging!\n");
#endif
然后,您的makefile可以包含:
ifeq ($(VERBOSE_PRINT), TRUE)
CFLAGS += -DVERBOSE_PRINT=TRUE
else
CFLAGS += -DVERBOSE_PRINT=FALSE
endif
這種技術不太常見。 如果未在編譯器命令行上指定值,則它將像#define VERBOSE_PRINT 0
一樣工作( C11§6.10.1有條件包含¶4 )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.