C语言编程学习笔记 —— #ifndef 的用法 ( 条件编译)

       在C语言的编程当中,经常要遇到将函数的声明以及定义放置在不同的文件当中,分开进行编译,于是就会面临有些头文件或者声明重复编译的情况。 如下所示:

  

      因此,为了解决这一个问题,我们来学习 #ifndef  ( 条件编译) 的用法。

一、#ifndef 的用法 

定义

  #ifndef x

  #define x

  ...

  #endif

  这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译。 C语言在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言编译系统包括预处理,编译和链接等部分。

  #ifndef x

  //先测试x是否被宏定义过

  #define x

  //如果没有宏定义下面就宏定义x并编译下面的语句

  ...

  #endif

  //如果已经定义了则编译#endif后面的语句

  条件指示符#ifndef检查预编译常量在前面是否已经被宏定义。如果在前面没有被宏定义,则条件指示符的值为真,于是从#ifndef到#endif之间的所有语句都被包含进来进行编译处理。相反,如果#ifndef指示符的值为假,则它与#endif指示符之间的行将被忽略。条件指示符#ifndef 的最主要目的是防止头文件的重复包含和编译。

补充一些内容

  千万不要忽略了头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。

  还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:

  #ifndef <标识>

  #define <标识>

  ......

  #endif

  <标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h

  #ifndef _STDIO_H_

  #define _STDIO_H_

  ......

#endif

#ifndef xxx//如果没有定义xxx
#define xxx//定义xxx
#endif //结束如果

       这个用法主要是在头文件中,主要是为了防止类重复的include,所以在类的头文件之前加上前面两个,用类名替代xxx,在最后加上最后一句。

二、 const 与 #define的比较

      C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
(1)   const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
 
(2)  有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
         在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

猜你喜欢

转载自blog.csdn.net/weixin_41695564/article/details/80918197