c编译预处理

一、文件包含
#include <头文件名称>
#include "头文件名称"
第一种形式 : 用来包含开发环境提供的库头文件,它指示编译预处理器在开发环境设定的搜索路径中查找所需的头文件
第二种形式 : 用来包含自己编写的头文件,它指示编译预处理器首先在当前工作目录下搜索头文件,如果找不到再到开发环境设定的路径中查找。
 
内部包含卫哨和外部包含卫哨
在头文件里面使用内部包含卫哨,就是使用一种标志宏,可以放心的在同一个编译单元及其包含的头文件中多次包含同一个头文件而不会造成重复包含。如:
#ifndef _STDDEF_H_INCLUDED_
#define _STDDEF_H_INCLUDED_
...... //头文件的内容
#endif
 
当包含一个头文件的时候,如果能够始终如一地使用外部包含卫哨,可以显著地提高编译速度,因为当一个头文件被一个源文件反复包含多次时,可以避免多次查找和打开头文件地操作。如:
#if !defined(_INCLUDED_STDDEF_H_)
#include <stddef.h>
#define _INCLUDED_STDDEF_H_
#endif
建议外部包含卫哨和内部包含卫哨使用同一个标志宏,这样可以少定义一个标志宏。如:
#if !defined_STDDEF_H_INCLUDED_
#include <stddef.h>
#endif
 
头文件包含的合理顺序
在头文件中:
1、包含当前工程中所需的自定义头文件
2、包含第三方程序库的头文件
3、包含标准头文件
在源文件中:
1、包含该源文件对应的头文件
2、包含当前工程中所需的自定义头文件
3、包含第三方程序库的头文件
4、包含标准头文件
 
 
 
 

避免重定义
  如果把一个struct定义放在一个头文件中,就有可能在一个编译程序中多次包含这个头文件。编译器认为重定义是一个错误。如下面的例子:
  // file : type.h
  struct type01
  {
  int a,b,c;
  };
  // file : a.h
  #include "type.h"
  ……
  // file : b.h
  #include "type.h"
  ……
  // file main.cpp
  #include "a.h"
  #include "b.h"
  int main(void)
  {
  ……
  }
  编译程序,编译器给出以下的错误提示:
  error C2011: “type01” : “struct”类型重定义
  原因是头文件type.h定义了一个struct类型type01,头文件a.h和b.h都包含了头文件type.h。而在main.cpp文件里却同时包含了头文件a.h和b.h。因此出现了重定义的错误。
  可以通过像以下那样改写type.h文件,从而避免重定义错误:
  // file : type.h
  #ifndef __TYPE_H__ // 如果标记没被设置
  #define __TYPE_H__ // 设置标记
  struct type01
  {
  int a,b,c;
  };
  #endif // End of __TYPE_H__
  通过这样改写type.h文件后,程序可以顺利编译过去了。
  我们是通过测试预处理器的标记来检查type.h头文件是否已经包含过了。如果这个标记没有设置,表示这个头文件没有被包含过,则应该设计标记。反之,如果这个标记已经设置,则表示这个头文件已经被包含,所以应该忽略。

你可能感兴趣的:(c编译预处理)