宏定义作为C语言的一个传统内容,如果使用新标准的话,一般也只用宏定义来结局编译的一些问题如:#ifndef,#if undefined()等。

宏定义究竟放在什么地方,在使用 C 语言老款编辑器情况下,一些程序大量使用宏定义,且很多程序都是将宏定义作为申明一样全部放在头文件中的,这个没有一个统一的说法,其中各有利弊,每个人风格不尽相同。

首先,宏定义的常量在编译的时候是作为内容直接替换的,因此这部分并不会因此占用你堆、栈等存储空间。所以这就导致无论你将宏定义放在头文件还是放在源文件中,资源消耗上面没有太大差别。差别就是在头文件和源文件中可以使用的作用域不同。

1. 放在头文件中:

  • 作用域更广,不仅仅对应源文件可以使用,且其他所有的源文件包含这个都可以使用,即便一些常量现在不会被使用,将来也可能会使用。
  • 作用域太宽,可能会与其他文件中的某个宏定义命名冲突,需要定义较长的名字。
  • 方便集中在一起进行管理,看起来代码更加显得整洁。

2. 放在头文件中:

  • 没有统一管理,分部零散,查找较麻烦,将来一些需要引用的话,重新修改程序。
  • 只作用需要使用到的范围,减少与其他文件的关联性,出错几率更低。
  • 宏定义名称无所谓起多长,作用域有限,不会与其他文件冲突。
  • 只将需要在其他文件中使用的宏定义放在头文件中,按需进行分配。

个人建议:
采用方法 2,将宏定义绝大多数放在 .c 文件中,只将极个别需要其他源文件引用的宏定义放在 .h 中,这可以有效控制一些源文件没必要的相关性,虽然较长的定义名也避免了出错,但为了减少耦合性,按照需求来进行分配算是一个良好的编程习惯,否则工程一旦复杂性增加难免会出现一些意想不到的问题。