|
問題:
如果沒定義LED.h
那這句能不能寫成#ifndef LED.H
__LED_H 這幾個(gè)橫桿都是什么意思啊
回答:
樓主你好。
先回答你的問題。
1 是可以寫成 LED.H只不過你接下來要寫一句#defined LED.H
因?yàn)?ifndef 后面的字符串 不管是 LED.H還是__LED_H和頭文件的名字沒有半毛錢關(guān)系。只不過是為了讀程序的時(shí)候方便而已。其實(shí)那個(gè)字符串只要合法的就行了。
2 用法
#ifndef 字符串
#define 上述字符串
#endif
一般放在頭文件里面,作用就是以防你在.c文件里面不小心重復(fù)包含頭文件的時(shí)候不會(huì)報(bào)錯(cuò)。
例如,現(xiàn)在你有 main.c LED.H 兩個(gè)文件。
如果你在main函數(shù)里面兩次包含頭文件LED.H。即
#include “LED.h”
#include “LED.h”
int main(void)
{
return 0;
}
那么你的程序肯定會(huì)報(bào)錯(cuò)。因?yàn)槟愕念^文件重復(fù)添加了。
但是如果你在LED.H里面動(dòng)一點(diǎn)手腳就把問題解決了,在LED.H添加如下代碼
#ifndef abcdefg
#define abcdefg
#include "stm32f10x.h"
void led_init(void);
...//其他函數(shù)聲明
#endif
就可以把問題解決。
分析如下:#ifndef 的是if no define----”如果沒有定義“的意思。帶#的是預(yù)編譯命令,在編譯之前執(zhí)行。
如果沒有定義abcdefg 那么就#define abcdefg 定義了abcdefg
當(dāng)你多次包含LED.H這個(gè)頭文件的時(shí)候。第一次肯定是沒有定義的,所以肯定會(huì)執(zhí)行
#define abcdefg 但是第二次,第三次,..以后再包含的時(shí)候,由于第一次已經(jīng)定義過了abcdefg字符串,所以第二次的#ifndef abcdefg 不成立,所以往下的語句就不會(huì)執(zhí)行。那么就不會(huì)重復(fù)包含頭文件了。也不會(huì)把頭文件里面聲明過的函數(shù)再繼續(xù)重復(fù)聲明了。也就不會(huì)報(bào)錯(cuò)了。所以記住一點(diǎn):#ifndef 在頭文件里的用法是通過判斷這個(gè)字符串是否被定義過,從而決定是否跳過某些語句來達(dá)到,條件編譯,防止報(bào)錯(cuò)的效果的。
當(dāng)然條件編譯的用處很靈活看你怎么用。給樓主總結(jié)一下3種條件編譯
第一種:
#if 表達(dá)式
程序段1
#endif
第二種:
#ifndef 表達(dá)式
程序段2
#endif
第三種
#ifdefine 表達(dá)式
程序段3
#endif
以上是三種基本的條件編譯,當(dāng)然可以嵌套。還可以加#elsedefine 不過elsedefine的宏命令簡(jiǎn)寫我忘記是什么了,哈哈。所以就不貼上了。反正用法和if-else 一樣,都是通過判斷表達(dá)式是否為真,來決定往下的程序段是否被編譯。
|
|