c語言ifndef
❶ 關於c語言中的#ifndef。。。endif 的用法,求高手詳解
#ifndef假如沒有定義,那麼進行宏定義。
#endif結束宏定義。
這個是為了避免頭文件重復包含而定義的,一般這個宏的定義方式為__頭文件名__H_
比方說你#include進來一個stdio.h,再#include進來一個string.h。也許在string.h頭文件里又include了stdio.h。這樣你的程序中就include了兩個stdio.h。定義了兩個printf函數等等。
這就麻煩了,編譯會出錯不說,就算編譯過了也是浪費資源
加了一個#ifndef
_STDIO_H的話。在#include進來的string.h中如果再試圖include一遍stdio.h的話,由於事先在第一個stdio.h中已經定義了_STDIO_H這個宏。所以不滿足#ifndef
_STDIO_H這個條件,就不會編譯第二次了。
#define
後面不一定要加兩個字元串。一個也行,加一個字元串如#define
_STDIO_H
,
#define
DEBUG
等等,一般在編譯前用來做開關。控制編譯部分。上面所說的頭文件中是一個例子。再舉一個查錯的例子
#define
DEBUG
...
...
#ifdef
DEBUG
fprintf(
stderr
,
"Debug
Message\n
"
);
#endif
...
當你程序完成之後。可以把#define
DEBUG一行用注釋屏蔽掉。這樣在編譯的時候就不會把debug部分也編譯進去了。
❷ C語言有個IFNDEF開始用來做
定義FLAG為1
所以 #ifndef不會被執行, 而是編譯#else部分
即#define M 3
於是 輸出為
2*M+6
注意 字元串中的M不會被替換。
❸ #ifndef的用法
#ifndef是宏定義裡面的一種,用來防止防止頭文件的重復包含和編譯。
比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,於是問題來了,大量的聲明沖突。
如果把頭文件的內容都放在#ifndef和#endif中,不管你的頭文件會不會被多個文件引用,你都要加上這個,就可以避免沖突的問題。
#ifndef可以根據是否已經定義了一個變數來進行分支選擇,一般用於調試等等.實際上確切的說這應該是預處理功能中三種(宏定義,文件包含和條件編譯)中的一種——條件編譯。 C語言在對程序進行編譯時,會先根據預處理命令進行「預處理」。C語言編譯系統包括預處理,編譯和鏈接等部分。
(3)c語言ifndef擴展閱讀:
#ifndef一般格式是這樣的:
#ifndef <標識>
#define <標識>
......
#endif
<標識>在理論上來說可以是自由命名的,但每個頭文件的這個「標識」都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前後加下劃線,並把文件名中的「.」也變成下劃線,如:stdio.h
#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif
❹ C語言 ifndef什麼意思(作用)#define STR_LEN 30 什麼意思
#ifndef x 意思就是如果x沒有定義,則執行#endif之前的程序,如果定義就跳過。
#define STR_LEN 30 就是宏定義,程序中只要出現 STR_LEN 就用30代替,使程序直觀
❺ C++#ifndef與#ifdef的區別是什麼
一、使用場景不同:
#ifndef使用場景為:
1、頭文件中使用,防止頭文件被多重調用。
2、作為測試使用,省去注釋代碼的麻煩。
3、作為不同角色或者場景的判斷使用。
#ifdef使用場景:
判斷某個宏是否被定義,若已定義,執行隨後的語句。
二、含義不同:
#ifndef表示ifnotdefine。
#ifdef表示ifdefine。
(5)c語言ifndef擴展閱讀:
#ifndef起到的效果是防止一個源文件兩次包含同一個頭文件,而不是防止兩個源文件包含同一個頭文件。
而編譯時,這兩個C文件要一同編譯成一個可運行文件。
把頭文件的內容都放在#ifndef和#endif中。不管頭文件會不會被多個文件引用,都要加上這個。
一般格式是這樣的:
#ifndef <標識>
#define <標識>.
...........
#endif<標識>
在理論上來說可以是自由命名的,但每個頭文件的這個「標識」都應該是唯一的。
標識的命名規則一般是頭文件名全大寫,前後加下劃線,並把文件名中的「.」也變成下劃線,如:
#ifndef_STDIO_H_#define_STDIO_H_......#endif.
在#ifndef中定義變數出現的問題(一般不定義在#ifndef中)。
#ifndefAAA#defineAAA...inti;...#endif
❻ #ifndef的用法
文件中的#ifndef
頭件的中的#ifndef,這是一個很關鍵的東西。比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,於是問題來了,大量的聲明沖突。
還是把頭文件的內容都放在#ifndef和#endif中吧。不管你的頭文件會不會被多個文件引用,你都要加上這個。一般格式是這樣的:
#ifndef
<標識>
#define
<標識>
......
......
#endif
<標識>在理論上來說可以是自由命名的,但每個頭文件的這個「標識」都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前後加下劃線,並把文件名中的「.」也變成下劃線,如:stdio.h
#ifndef
_STDIO_H_
#define
_STDIO_H_
......
#endif
2.在#ifndef中定義變數出現的問題(一般不定義在#ifndef中)。
#ifndef
AAA
#define
AAA
...
int
i;
...
#endif
裡面有一個變數定義
在vc中鏈接時就出現了i重復定義的錯誤,而在c中成功編譯。
結論:
(1).當你第一個使用這個頭的.cpp文件生成.obj的時候,int
i
在裡面定義了當另外一個使用這個的.cpp再次[單獨]生成.obj的時候,int
i
又被定義然後兩個obj被另外一個.cpp也include
這個頭的,連接在一起,就會出現重復定義.
(2).把源程序文件擴展名改成.c後,VC按照C語言的語法對源程序進行編譯,而不是C++。在C語言中,若是遇到多個int
i,則自動認為其中一個是定義,其他的是聲明。
(3).C語言和C++語言連接結果不同,可能(猜測)時在進行編譯的時候,C++語言將全局
變數默認為強符號,所以連接出錯。C語言則依照是否初始化進行強弱的判斷的。(參考)
解決方法:
(1).把源程序文件擴展名改成.c。
(2).推薦解決方案:
.h中只聲明
extern
int
i;在.cpp中定義
<x.h>
#ifndef
__X_H__
#define
__X_H__
extern
int
i;
#endif
//__X_H__
<x.c>
int
i;
注意問題:
變數一般不要定義在.h文件中。
❼ c語言中的#ifndef,def,endif等宏是什麼意思
這些是條件編譯。
#ifdef 當後續宏被定義時,代碼段會被編譯。
#ifndef 當宏未定義時編譯。
#endif 條件編譯的結束標記。