Posted on 2018-11-28 15:55
Prayer 閱讀(702)
評論(0) 編輯 收藏 引用 所屬分類:
C/C++ 、
makefile
https://blog.csdn.net/gdutliuyun827/article/details/17297513
在源代碼里面如果這樣是定義的:
#ifdef MACRONAME
//可選代碼
#endif
那在makefile里面
gcc -D MACRONAME=MACRODEF
或者
gcc -D MACRONAME
這樣就定義了預處理宏,編譯的時候可選代碼就會被編譯進去了。
對于GCC編譯器,有如下選項:
-D macro=string,等價于在頭文件中定義:#define macro string。例如:-D TRUE=true,等價于:#define TRUE true
-D macro,等價于在頭文件中定義:#define macro 1,實際上也達到了定義:#define macro的目的。例如:-D LINUX,等價于:#define LINUX 1(與#define LINUX作用類似)。
--define-macro macro=string與-D macro=string作用相同。
如:
TEST.C 文件 #include <stdio.h> #include <stdlib.h> main() { #ifdef p1 printf("Hello p1"); #else printf("Hello p2"); #endif }
1.
編譯: gcc -o test test.c
運行: ./test
輸出: Hello p2
2.
編譯: gcc -o test test.c -D p1
運行: ./test
輸出: Hello p1
還有另外一種使用方式:
Makefile寫法:
$(SERVER_NAME):$(SERVER_OBJ) $(COM_OBJS) $(CC) -Wall -pthread -D KRC_SERVER_NAME=$(SERVER_NAME)_FLAG
C代碼中用法:
#if KRC_SERVER_NAME == krc_search_FLAG #elif KRC_SERVER_NAME == krc_feedback_FLAG #else #endif 注意:其中的兩個參數為宏定義,不能使用常量定義,因為需要在預編譯階段就要確定其值! #define krc_search_FLAG 1 #define krc_feedback_FLAG 2
這種用法也能實現條件編譯的作用,而且更好!