条件编译 #ifndef _HEAD_H...中下划线的理解

1.下划线“__”属于编程风格的内容,对程序没有影响。不用下划线也可以,用几个下划线也由个人习惯。

 2.其实质是一个宏名。由此我们可以防止发生重复定义或声明。

假设你的头文件名为head.h,根据习惯,我们声明一个宏HEAD_H,对应这个头文件,在头文件中开始的地方和结尾的地方加上   对HEAD_H的声明和判断,头文件Head.h如下: 

#ifndef   HEAD_H 
#define   HEAD_H 

……(头文件内容) 

#endif 


这样,头文件可以避免被多次包含。头文件中定义的变量不存在重复声明或定义。

 

 

3. __FILE__,__LINE__   都是与定义的宏,使用_   和   __   开始的函数一般都是专用的函数,一般都是于特定系统相关的,如果要想有更好的移植性,应该避免使用。

 

一般只有已经广泛使用的系统库函数和宏才有资格使用_甚至__打头,为的是不与用户定义的名字   
  冲突,所以B.Stroustup在《The   C++   Programming   Language》中告诫我们一般不要使用_或__   
  打头的标志符,这也是一个编程风格的问题吧。

 

先回答你的问题。 1 是可以写成 LED.H只不过你接下来要写一句#defined LED.H 因为#ifndef 后面的字符串 不管是 LED.H还是__LED_H和头文件的名字没有半毛钱关系。只不过是为了读程序的时候方便而已。其实那个字符串只要合法的就行了。

2 用法 #ifndef 字符串 #define 上述字符串 #endif 一般放在头文件里面,作用就是以防你在.c文件里面不小心重复包含头文件的时候不会报错。 例如,现在你有 main.c LED.H 两个文件。 如果你在main函数里面两次包含头文件LED.H。即 #include “LED.h” #include “LED.h” int main(void) { return 0; } 那么你的程序肯定会报错。因为你的头文件重复添加了。 但是如果你在LED.H里面动一点手脚就把问题解决了,在LED.H添加如下代码 #ifndef abcdefg #define abcdefg #include "stm32f10x.h" void led_init(void); ...//其他函数声明 #endif 就可以把问题解决。 分析如下:#ifndef 的是if no define----”如果没有定义“的意思。带#的是预编译命令,在编译之前执行。 如果没有定义abcdefg 那么就#define abcdefg 定义了abcdefg 当你多次包含LED.H这个头文件的时候。第一次肯定是没有定义的,所以肯定会执行 #define abcdefg 但是第二次,第三次,..以后再包含的时候,由于第一次已经定义过了abcdefg字符串,所以第二次的#ifndef abcdefg 不成立,所以往下的语句就不会执行。那么就不会重复包含头文件了。也不会把头文件里面声明过的函数再继续重复声明了。也就不会报错了。所以记住一点:#ifndef 在头文件里的用法是通过判断这个字符串是否被定义过,从而决定是否跳过某些语句来达到,条件编译,防止报错的效果的。 当然条件编译的用处很灵活看你怎么用。给楼主总结一下3种条件编译 第一种: #if 表达式 程序段1 #endif 第二种: #ifndef 表达式 程序段2 #endif 第三种 #ifdefine 表达式 程序段3 #endif 以上是三种基本的条件编译,当然可以嵌套。还可以加#elsedefine 不过elsedefine的宏命令简写我忘记是什么了,哈哈。所以就不贴上了。反正用法和if-else 一样,都是通过判断表达式是否为真,来决定往下的程序段是否被编译。

这段C语言代码包含了`#ifndef`、`#define`、`#include`和`#endif`这些预处理指令,以下是对其含义和作用的分析: ### 代码含义 - `#ifndef _LED_H_`:这是一个预处理指令,`#ifndef`是“if not defined”的缩写,意思是检查名为`_LED_H_`的宏是否已经被定义。如果尚未定义,则执行后续代码块中的内容;如果已经定义,则跳过该代码块直到`#endif`处 [^2][^3][^4]。 - `#define _LED_H_`:若`_LED_H_`宏未被定义,此指令会定义这个宏。一旦定义之后,后续再次遇到`#ifndef _LED_H_`时,就会判定该宏已定义,从而跳过对应的代码块 [^1][^2][^3][^4]。 - `#include "main.h"`:此指令是将名为`main.h`的头文件包含到当前文件中。`main.h`可能包含了一些全局变量、函数声明、宏定义等内容,通过该指令可以让当前文件使用这些内容 [^3]。 - `#endif`:标志着`#ifndef`指令代码块的结束。 ### 代码作用 这段代码的主要作用是防止头文件的重复包含。在大型项目中,可能会有多个源文件包含同一个头文件,如果不采取措施,就会导致头文件内容被重复编译,进而引发重复定义的错误。使用`#ifndef`、`#define`和`#endif`组合可以确保头文件只被编译一次。当第一次包含该头文件时,`_LED_H_`宏尚未定义,因此会执行代码块中的内容,定义`_LED_H_`宏并包含`main.h`头文件;当再次包含该头文件时,由于`_LED_H_`宏已经被定义,`#ifndef`条件不成立,会跳过代码块,避免重复编译 [^2][^4]。 ### 代码示例 以下是一个更完整的示例,展示了如何使用这种头文件保护机制: ```c // led.h #ifndef _LED_H_ #define _LED_H_ #include "main.h" // 假设这里有一些LED相关的函数声明 void led_init(); void led_on(); void led_off(); #endif // main.c #include "led.h" int main() { led_init(); led_on(); return 0; } ```
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值