使用預編譯指令,常用的預編譯指令如下:
//條件編譯
#define
// 巨集定義
#undef
// 取消巨集
#include
// 文字包含
#ifdef
// 如果巨集被定義就進行編譯
#if defined
// 與ifdefine的區別在於可以可以組成複雜的判別條件
#ifndef
// 如果巨集未被定義就進行編譯
#if !defined
// 與if !define的區別在於可以可以組成複雜的判別條件
#endif
// 結束編譯塊的控制
#if defined
// 表示式非零就對**進行編譯
#else
// 作為其他預處理的剩餘選項進行編譯
#elif
// 這是一種#else和#if的組合選項
#elif defined
// 與ifdefine的區別在於可以可以組成複雜的判別條件
#elif !defined
// 與ifdefine的區別在於可以可以組成複雜的判別條件
//編譯指令
#line
// 改變當前的行數和檔名稱
#error
// 輸出乙個錯誤資訊
#pragma
// 為編譯程式提供非常規的控制流資訊,可跟once,message等許多引數。
注:這裡針對的都是在乙個標頭檔案的裡內容都包含在條件指令中:.c
檔案中避免標頭檔案重複引入。如果乙個工程有多個".c"檔案,由於編譯器對每個.c
檔案是分開處理的,只在最後進行鏈結。在這種情況下,如果有多個.c
檔案都直接或間接引入了某個標頭檔案,這時無法避開的。
#ifndef ***x_h
#define ***x_h..
....
....
..#endif
優點:
缺點:pragma once
編譯指令使得同乙個檔案不會被包含多次。注意這裡所說的「同乙個檔案」是指物理上的乙個檔案,而不是指內容相同的兩個檔案。你無法對乙個標頭檔案中的一段**作pragma once宣告,而只能針對檔案。
優點:缺點:
兩者混用可以節約一定的間,比如多次引入同一「物理意義上的」標頭檔案,就可以不用展重複引入開頭檔案。
#pragma once
#ifndef ***x_h
#define ***x_h
…………
#endif
最根本的方式是將宣告和定義分開。
在.c
檔案中定義,在*.h
中宣告。宣告包括函式宣告,自定義資料型別宣告,外部變數宣告等。如:
#include
"add.h"
//標頭檔案應全部在對應的*.h中引入,`*.c`檔案只需引入對應的`*.h`檔案即可
int c[10]
=;intadd
(int a,
int b)
#pragma once
#ifndef test_h
#define test_h
extern
int c;
intadd
(int a,
int b)
;#endif
#include
"test.h"
intmain()
如果一定要把定義放在標頭檔案中,則該工程中只能有乙個.c
檔案中可以先定義對應巨集,再直接或間接引入該標頭檔案。格式如下:
//乙個工程有多個.c檔案
定義放在標頭檔案中
#pragma once
#ifndef comm_h
#define comm_h
#ifdef extern_c
int c=10;
#else
extern
int c;
#endif
#endif
#pragma once
#ifndef addc_h
#define addc_h
#include
"comm.h"
intaddc
(int
,int);
#endif
#define extern_c
//只能有乙個.c檔案中可以先定義對應巨集,再直接或間接引入該標頭檔案
#include
"addc.h"
intaddc
(int a,
int b)
#pragma once
#ifndef subc_h
#define subc_h
#include
"comm.h"
intsubc
(int
,int);
#endif
#include
"sub.h"
intsubc
(int a,
int b)
#include
"add.h"
#include
"sub.h"
intmain()
....
..
避免變數重複定義和重複包含標頭檔案的方法
重複包含的影響 在預處理對時候,include相同的檔案,預處理器會檢查 是否有定義再決定要不要複製內容,重複包含會是編譯器多檢查幾次而已。另外在使用增量編譯的時候,這個檔案變化,所有 include 這個檔案的檔案都需要重新編譯,即使沒有去使用裡面的任何內容。避免方法 1.把頭檔案放在巨集裡 if...
標頭檔案如何避免重複宣告
向c語言專案graph1中新增graph2.h這樣乙個標頭檔案。在 clion 中我們會發現,在標頭檔案graph2.h中,會自動生成以下三行 ifndef graph1 graph2 h define graph1 graph2 h part1 endif part2這三行 主要作用是 防止該標頭...
標頭檔案如何避免重複宣告
向c語言專案graph1中新增graph2.h這樣乙個標頭檔案。在 clion 中我們會發現,在標頭檔案graph2.h中,會自動生成以下三行 ifndef graph1 graph2 h define graph1 graph2 h part1 endif part2這三行 主要作用是 防止該標頭...