1.首先文件包含的两种查找路径:
1.在编译器INCLUDE系统路径中查找文件
2.在源文件所处的文件中查找,如果找不到再在系统路径中查找
2.文件重复包含问题:
1.使用条件编译:
#if !define(__HELLO__)
#define __HELLO__
..... //头文件内容
#endif
2.使用特殊预处理命令#pragma once
#pragma once
.... //头文件内容
即在头文件第一行增加这个预处理命令,它的意思是:在编译一个源文件时,只对该文件包含一次
二.条件编译
目的:根据需要将源程序的不同部分编译进程序
典型的条件编译是将程序编译分成调试版本(Debug)和发行版(Release)
1.条件编译使用宏定义条件,其命令形式:
命令形式:
#define 条件字段
#define 条件字段 常量表达式
例如:
(1)#define DEBUG //表示定义DEBUG
(2)#define WIN 0x00000001 // 表示定义WIN 且值......
主流的编译器系统也支持通过编译参数设置条件,如GCC命令行使用:
gcc -D 条件字段 //(1)
gcc -D条件字段=常量表达式 //(2)
gcc -DEBUG
gcc -DWINVER=0x0501
VC命令行使用:
CL /D 条件字段 //(1)
CL /D 条件字段=常量表达式//(2)
2.#ifdef、#ifndef
#ifdef条件编译命令测试条件字段是否定义,以此选择参与编译的程序代码段,它有两种命令形式:
#ifdef 条件字段
程序代码1
#endif
#ifdef 条件字段
程序代码1
#else
程序代码2
#endif
表示如果条件字段已经被#define 定义过,无论是否有值,编译器只编译程序代码段1,否则只编译程序代码段2,程序代码段可以是任意行数的程序或预处理指令。
下面代码测试是否是否使用VC编译器且为控制台程序,如果是则编译程序代码段:
#ifdef __MSC__VER //如果是VC++编译器,其内部已定义
#ifndef _CONSOLE //VC++编译器根据控制台编译参数内部已定义
...... //程序代码
#endif
#endif
3.#if - #elif
#if 条件编译命令根据表达式的值选择参与编译的程序代码,其命令形式为:
#if 常量表达式
程序代码1
#else
程序代码2
#endif
当预处理器遇到#if命令时,先计算常量表达式(像if语句那样),如果表达式的值非0(即为真),则编译程序代码1,否则编译程序代码2.请注意,常量表达式只能使用由#define定义的常量,不能像if语句那样使用程序中的变量。。。。没有定义过的表达式#if将其值作为 0.
转载于:https://www.cnblogs.com/aswater-yuanye/archive/2013/01/15/2860601.html