天天看點

#ifdef #endif #ifndef 定義+代碼詳解1. 這些代碼是什麼?屬于C/C++中什麼類型的詞?2. 這些代碼出現的意義是什麼?3.代碼的具體用法及示例(分為實作檔案 + 頭檔案)

1. 這些代碼是什麼?屬于C/C++中什麼類型的詞?

#ifdef  #endif  #ifndef 屬于C/C++預處理指令,常見的預處理指令還包括#include #define #undef #elif #error等。

預處理指令定義:預處理指令是以 #号開頭 的代碼行。#号必須是該行除了任何空白字元外的第一個字元。#後是 指令關鍵字 ,在關鍵字和#号之間允許存在任意個數的空白字元。整行語句構成了一條預處理指令,該指令将在 編譯器進行編譯之前 對源代碼做某些轉換。

2. 這些代碼出現的意義是什麼?

一般情況下,源程式中所有的行都參加編譯。C/C++中有個概念叫做“ 條件編譯 ”。“條件編譯”要求做到對 指定部分 内容編譯。當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。而這些預處理指令,可以幫助我們達到這個效果。

3.代碼的具體用法及示例(分為實作檔案 + 頭檔案)

實作檔案中:

1  ---  辨別符被定義(出現#define ***):

#include<iostream>
using namespace std;
#define NYJ

int main()
{
#ifdef NYJ
	cout << "ifdef NYJ" << endl;
#else
	cout << "else" << endl;
#endif
}
           

運作結果:

#ifdef #endif #ifndef 定義+代碼詳解1. 這些代碼是什麼?屬于C/C++中什麼類型的詞?2. 這些代碼出現的意義是什麼?3.代碼的具體用法及示例(分為實作檔案 + 頭檔案)

 此時因為辨別符“NYJ”被定義了,是以編譯器會對#ifdef 後面的内容進行編譯,與此同時跳過對#else後面内容的編譯。

2  ---  辨別符沒有被定義(不存在#define ***):

運作結果:

#ifdef #endif #ifndef 定義+代碼詳解1. 這些代碼是什麼?屬于C/C++中什麼類型的詞?2. 這些代碼出現的意義是什麼?3.代碼的具體用法及示例(分為實作檔案 + 頭檔案)

 此時辨別符“NYJ”未被定義,是以編譯器不會對#ifdef後面的内容進行編譯,與此同時對#else #endif 後面内容進行編譯。

注釋:在以上代碼中,#else并非必須出現。

ifndef的用法

此外,還有 #ifndef 的用法,顧名思義,ifdef = if define ,而 ifndef = if not define ,與ifdef意思恰好相反,以下是關于它的代碼示例:

#include<iostream>
using namespace std;

int main()
{
#ifndef NYJ
	cout << "ifndef NYJ" << endl;
#else
	cout << "else" << endl;
#endif
}
           

 辨別符沒有被定義(不存在#define ***):

#ifdef #endif #ifndef 定義+代碼詳解1. 這些代碼是什麼?屬于C/C++中什麼類型的詞?2. 這些代碼出現的意義是什麼?3.代碼的具體用法及示例(分為實作檔案 + 頭檔案)

辨別符被定義(出現#define ***):

#ifdef #endif #ifndef 定義+代碼詳解1. 這些代碼是什麼?屬于C/C++中什麼類型的詞?2. 這些代碼出現的意義是什麼?3.代碼的具體用法及示例(分為實作檔案 + 頭檔案)

頭檔案中:

在頭檔案中使用 #ifdef 和#ifndef,可以防止雙重定義的錯誤。

例如在頭檔案 “NYJ.h”中,定義了如下類

class D
{
	int a;
	int b;
};
           
#ifdef #endif #ifndef 定義+代碼詳解1. 這些代碼是什麼?屬于C/C++中什麼類型的詞?2. 這些代碼出現的意義是什麼?3.代碼的具體用法及示例(分為實作檔案 + 頭檔案)

 雙重定義:在 “K.h” 中,由于包含了 NYJ.h ,是以包含了 Class D ,同理,K.h中包含了a.h,而a.h中又包含了NYJ.h,是以Class D被雙重定義了,而類是不允許被雙重定義的,是以,為防止這種現象發生,我們可以采取如下措施:

#ifndef NYJ_H
//if !define NYJ_H  也可以這樣寫
#define NYJ_H
class D
{
   int a;
   int b;
};
#endif
           

這樣一來,第一次調用這個頭檔案的時候,沒有定義NYJ_H,就會繼續對下面的語段進行聲明。但是當第二次調用頭檔案時,已經定義了NYJ_H,是以就不會進行下面的代碼聲明了。這就是條件編譯防止頭檔案包含的原理。

繼續閱讀