避免標頭檔案重複引入和重複定義

2021-08-07 02:29:15 字數 2921 閱讀 2065

使用預編譯指令,常用的預編譯指令如下:

//條件編譯

#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這三行 主要作用是 防止該標頭...