C語言的巨集定義怎麼用 巧用C語言巨集定義

2021-09-24 19:16:09 字數 3955 閱讀 8292

例如:**中多個地方使用當前時間作為字串,如果不使用巨集定義,**中如果有十個地方使用了當前時間這個字串,那麼我每一次編譯**,都要修改十個地方,但是如果我使用了巨集定義:

#define current_time        "14:30"

char time= current_time;

printf("current time is %s.",current_time);

........

這樣的話,每次編譯**,我們只用修改巨集current_time即可。

例如:乙個長方形物體,長2公尺,寬1.5公尺,高0.3公尺,要計算這個物體的體積並賦值給乙個變數,可以這樣:

float volume = 2*1.5*0.3;
也可以這樣

int volume = 200*150*30;
當然還可以這樣

int volume = 2000*1500*300;
上面三種方法分別是用立方公尺、立方厘公尺、立方公釐為單位,不思考一番,很難看出到底是什麼意思;

如果使用巨集定義表達:

#define length_m                2

#define length_cm               200

#define length_mm               2000

#define width_m                 1.5

#define width_cm                150

#define width_meter             1500

#define height_m                0.3

#define height_cm               30

#define height_mm               300

#define volume_m3                (length_m*width_m*height_m)

#define volume_cm3               (length_cm*width_cm*height_cm)

#define volume_mm3               (length_mm*width_mm*height_mm)

可以看到使用巨集定義的**可讀性更強。

再例如:有乙個陣列很大,定義這個常量陣列就會占用很大空間:

char fw_array=;
#define fw_array_body    0xff, 0xfb, 0xb0, 0xc0, 0x00, 0x00, 0x17, 0xb8, 0x92, 0xf7, 0x95, 0xde, 0x00, 0x03, 0xe4, \

0x32, 0xe8, 0xab, 0x3d, 0xc0, 0x02, 0x71, 0xa2, 0x5c, 0x8d, 0xf2, 0xa0, 0xa9, 0x86, 0xa0, 0x79, \

0x82, 0x82, 0xb1, 0x95, 0x85, 0x90, 0x38, 0xfd, 0x32, 0x55, 0x1f, 0x36, 0x76, 0x03, 0x36, 0xcd, \

0xab, 0x35, 0x44, 0x61, 0x33, 0x69, 0x6a, 0x39, 0xce, 0x77, 0x39, 0x15, 0xcb, 0x34, 0x9c, 0x6b, \

0x32, 0x31, 0x3a, 0x35, 0xc9, 0x52, 0x33, 0xa0, 0x3c, 0x32, 0xd5, 0x4f, 0x36, 0x15, 0x4f, 0x32, \

0xb4, 0x2a, 0x38, 0xed, 0x64, 0xe8, 0x6f, 0x33, 0x4a, 0x8f, 0x49, 0x43, 0xc6, 0x20, 0x12, 0x18, \

0x68, 0x10, 0x96, 0xa6, 0x0d, 0x0a, 0x98, 0x64, 0x26, 0x61, 0xc0, 0xa1, 0x84, 0x81, 0x81, 0x00, \

0x46, 0xaa, 0x59, 0xf2, 0xcd, 0xa2, 0x9c, 0x0c, 0x9c, 0x86, 0x01, 0x00, 0xa7, 0x5c, 0x89, 0xac, \

0x35, 0xca, 0x57, 0x0d, 0xaf, 0xc8, 0xe5, 0x72, 0xfe, 0xff, 0xe7, 0x4f, 0x4f, 0x4f, 0x2c, 0xa4, \

0xe6, 0xeb, 0xdb, 0xcf, 0x3c, 0xec, 0x61, 0xcf, 0xff, 0xff, 0xce, 0x90, 0x30, 0x5c, 0x1f, 0x0f, \

0xe5, 0xc1, 0xf7, 0xf8, 0x62, 0x27, 0x0f, 0xf1, 0x39, 0xfc, 0xb8, 0x3f, 0xc1, 0xf3, 0xed, 0xac

然後在需要用到的地方只要使用這個巨集就可以了

char fw_array=;
這樣是不是更方便閱讀了^_^

可以重新命名函式,例如:

int function_example(int reg,int value);

#define write_reg_data(a,b)    function_example(a,b)

做了這樣的巨集定義之後,在**中使用函式function_example的地方可以用write_reg_data代替;

可以簡化表示式,

例如:

比較兩個數哪個大,可以這樣:

int get_max_number(int a,int b)

也可以使用巨集定義:

#define get_max_number(a,b)         ((a)>(b)?(a) : (b))
在**中,使用函式get_max_number和使用巨集get_max_number效果是一樣的,並且使用巨集定義的方式效率還會更高;

例如:

#define log_e(error)        printf("%s.",#error)
這樣定義之後,傳入的引數就會被當做字串,

log_e(fatal error!) 相當於 printf("%s.","fatal error!")
可以簡單理解為,用#之後,傳入的引數會被「」包裹;

如果你想定義乙個字串,但是字串的一部分是可變的,這樣顯然是不行的:

#define type(a) the_type_is_a

#define type(a) the_type_is_ a

#define type(a) the_type_is_(a)

#define type(a) the_type_is_ (a)

我們想要把a當做引數來用拼接進巨集定義的物件中,我們可以這樣用:

#define type(a) the_type_is_##a
這樣定義之後,##會告訴預編譯器:先把我前後要替換的引數替換了,然後將我前後拼接到一起。

type(int) 經過預編譯之後會變成 the_type_is_int
__date__:在原始檔中插入當前的編譯日期

__time__:在原始檔中插入當前編譯時間;

__file__:在原始檔中插入當前源檔名;

__line__:在源**中插入當前源**行號;

__function__:在源**中插入當前所在函式名稱;

__stdc__:當要求程式嚴格遵循ansi c標準時該標識被賦值為1;

__cplusplus:當編寫c++程式時該識別符號被定義。

C語言巨集定義

c語言有很多預處理命令,如包含命令 include,巨集定義命令 define。預處理命令在程式編譯之前被編譯器處理,而巨集定義也在此時被替換。或c 語言源程式中允許用乙個識別符號來表示乙個字串,稱為 巨集 被定義為 巨集 的識別符號稱為 巨集名 在編譯預處理時,對程式中所有出現的 巨集名 都用巨集...

C語言巨集定義

乙個巨集定義的作用域是從定義處到 undef處或檔案結尾。undef num 現在此處num沒有定義。1.ifdef num 如果num有巨集定義就編譯此處。else 如果num沒有巨集定義就編譯此處 endif 不論num 有沒有巨集都編譯,即判斷體已結束。ifndef num 如果num沒有巨集...

C語言(巨集定義)

巨集定義是c提供的三種預處理功能 巨集定義 檔案包含 條件編譯 的其中一種。c語言執行的流程 1 編譯 形成目標 obj 2 連線 將目標 與c函式庫連線合併,形成最終的可執行檔案 3 執行 巨集定義也叫做 巨集替換 預編譯指令 作用 使用define指令 1 定義標示,防止檔案重複引入 如 ifd...