欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談#ifndef,#define,#endif的作用和用法

 更新時間:2016年12月23日 09:14:42   投稿:jingxian  
下面小編就為大家?guī)硪黄獪\談#ifndef,#define,#endif的作用和用法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

問題:ifndef/define/endif”主要目的是防止頭文件的重復(fù)包含和編譯

========================================================

用法:

.h文件,如下:
#ifndef XX_H
#define XX_H
...
#endif

這樣如果有兩個地方都包含這個頭文件,就不會出現(xiàn)兩次包含的情況 。。

因為在第二次包含時 XX_H 已經(jīng)有定義了,所以就不再 include了
-------------------------------------------------------

#ifndef GRAPHICS_H // 防止graphics.h被重復(fù)引用
#define GRAPHICS_H

#include <math.h> // 引用標準庫的頭文件
…
#include “myheader.h” // 引用非標準庫的頭文件
…
void Function1(…); // 全局函數(shù)聲明
…
class Box // 類結(jié)構(gòu)聲明
{
…
};
#endif

-----------------------------------------------------

那是指你建立多個文件時,多個文件里都包含這個頭文件
-----------------------------------------------------

給你舉個例子,再順便分析一下:

假設(shè)你的工程里面有4個文件,分別是a.cpp,b.h,c.h,d.h

a.cpp的頭部是:
#include "b.h "
#include "c.h "

b.h和c.h的頭部都是:
#include "d.h "

而d.h里面有class D的定義。

這樣一來,

編譯器編譯a.cpp的時候,先根據(jù)#include "b.h "去編譯b.h這個問題,再根據(jù)b.h里面的#include "d.h ",去編譯d.h的這個文件,這樣就把d.h里面的class D編譯了;

然后再根據(jù)a.cpp的第二句#include "c.h ",去編譯c.h,最終還是會找到的d.h里面的class D,但是class D之前已經(jīng)編譯過了,所以就會報重定義錯誤。

加上ifndef/define/endif,就可以防止這種重定義錯誤。
--------------------------------------------------
-------------------------------------------------

1.比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,于是問題來了,大量的聲明沖突。 還是把頭文件的內(nèi)容都放在#ifndef和#endif中吧。

不管你的頭文件會不會被多個文件引用,你都要加上這個。

一般格式是這樣的:

#ifndef <標識>
#define <標識>
......
......
#endif <標識>

在理論上來說可以是自由命名的,但每個頭文件的這個“標識”都應(yīng)該是唯一的。標識的命名規(guī)則一般是頭文件名全大寫,前后加下劃線,并把文件名中的“.”也變成下劃線,如:stdio.h

#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif

2.在#ifndef中定義變量出現(xiàn)的問題(一般不定義在#ifndef中)。

#ifndef AAA
#define AAA
...
int i;
...
#endif

里面有一個變量定義在vc中鏈接時就出現(xiàn)了i重復(fù)定義的錯誤,而在c中成功編譯。

原因:

(1).當你第一個使用這個頭的.cpp文件生成.obj的時候,int i 在里面定義了當另外一個使用這個的.cpp再次[單獨]生成.obj的時候,int i 又被定義然后兩個obj被另外一個.cpp也include 這個頭的,連接在一起,就會出現(xiàn)重復(fù)定義.

(2).把源程序文件擴展名改成.c后,VC按照C語言的語法對源程序進行編譯,而不是C++。在C語言中,若是遇到多個int i,則自動認為其中一個是定義,其他的是聲明。

(3).C語言和C++語言連接結(jié)果不同,可能(猜測)在進行編譯的時候,C++語言將全局變量默認為強符號,所以連接出錯。C語言則依照是否初始化進行強弱的判斷的。

參考解決方法:

(1).把源程序文件擴展名改成.c。

(2).推薦解決方案: .h中只聲明 extern int i;

在.cpp中定義

#ifndef __X_H__
#define __X_H__
extern int i;
#endif //__X_H__ int i;
注意問題:變量一般不要定義在.h文件中。

以上就是小編為大家?guī)淼臏\談#ifndef,#define,#endif的作用和用法全部內(nèi)容了,希望大家多多支持腳本之家~

相關(guān)文章

  • C++實現(xiàn)雷霆戰(zhàn)機可視化小游戲

    C++實現(xiàn)雷霆戰(zhàn)機可視化小游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)雷霆戰(zhàn)機可視化小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 帶頭結(jié)點單鏈表(詳解)

    帶頭結(jié)點單鏈表(詳解)

    這篇文章主要介紹了帶頭結(jié)點單鏈表?(詳解),需要的朋友可以參考下
    2023-07-07
  • C++實現(xiàn)四則混合運算計算器

    C++實現(xiàn)四則混合運算計算器

    這篇文章主要為大家詳細介紹了C++實現(xiàn)四則混合運算計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • c語言 兩字符串交叉合并實例

    c語言 兩字符串交叉合并實例

    今天小編就為大家分享一篇c語言 兩字符串交叉合并實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 通俗易懂講解C語言與Java中二叉樹的三種非遞歸遍歷方式

    通俗易懂講解C語言與Java中二叉樹的三種非遞歸遍歷方式

    二叉樹是一種非常重要的數(shù)據(jù)結(jié)構(gòu),很多的數(shù)據(jù)結(jié)構(gòu)都是基于二叉樹的基礎(chǔ)演變過來的。二叉樹的前,中,后3種遍歷方式,因為樹的定義本身就是遞歸定義的,所以采用遞歸的方法來實現(xiàn)是很簡單的
    2021-09-09
  • C++ OpenCV實戰(zhàn)之形狀識別

    C++ OpenCV實戰(zhàn)之形狀識別

    本案例通過使用OpenCV中的approxPolyDP進行多邊形近似,進而進行基礎(chǔ)形狀識別(圓、三角形、矩形、星形…),快跟隨小編一起動手嘗試一下
    2022-07-07
  • C++實現(xiàn)從輸入中讀取字符串

    C++實現(xiàn)從輸入中讀取字符串

    這篇文章主要介紹了C++實現(xiàn)從輸入中讀取字符串的實現(xiàn)思路和具體代碼,非常的簡單實用,有需要的小伙伴可以參考下
    2016-05-05
  • C++?DLL注入工具(完整源碼)

    C++?DLL注入工具(完整源碼)

    這篇文章主要介紹了C++?DLL注入工具的相關(guān)資料,并向大家分享了完整的源碼,具有一定的參考價值,希望對正在工作或?qū)W習的你有所幫助
    2022-02-02
  • C++?Boost?CircularBuffer算法超詳細精講

    C++?Boost?CircularBuffer算法超詳細精講

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C語言進階教程之預(yù)處理

    C語言進階教程之預(yù)處理

    C語言提供了多種預(yù)處理功能,如宏定義、文件包含、條件編譯等,下面這篇文章主要給大家介紹了關(guān)于C語言進階教程之預(yù)處理的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02

最新評論