簡體   English   中英

Makefile和C代碼之間的變量沖突

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM