条件编译 #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 一样,都是通过判断表达式是否为真,来决定往下的程序段是否被编译。

你可能感兴趣的:(STM32)