- 命令行定义
- 条件编译
- 常见的条件编译的预处理指令
- 嵌套条件编译预处理指令
- 文件包含
- #include<>与#include""区别
许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。
例如:当我们根据同一个源文件要
编译出不同的一个程序的不同版本的时候,这个特性有点用处。(假定某个程序中声明了一个某个长度的数组,如果
机器内存有限,我们需要一个很小的数组,但是另外一个机器内存大写,我们需要一个数组能够大写。)
在gcc进行编译
#includeint main() { int array[MAX]; int i = 0; for (i = 0; i< MAX; i++) { array[i] = i; } for (i = 0; i< MAX; i++) { printf("%d ", array[i]);//0~9 } printf("n"); return 0; }
可以看到,代码中没有明确定义数组的大小。在编译这种代码时,我们需要使用命令行对数组的大小进行定义。
例如,在Linux环境下,编译指令如下:
gcc -D test.c MAX = 10
给test.c
定义一个MAX=10
条件编译即满足条件则进行编译,不满足条件则不编译
在编译一个程序的时候我们如果要将一条语句(一组语句)编译或者放弃是很方便的。因为我们有条件编译指令。
比如说: 调试性的代码,删除可惜,保留又碍事,所以我们可以选择性的编译
#include#define M 10 int main() { int i = 0; int arr[10] = { 0 }; for (i = 0; i < 10; i++) { arr[i] = i; #ifdef M printf("%dn", arr[i]);//为了观察数组是否赋值成功。 // 0~9 #endif //__DEBUG__ } return 0; }
常见的条件编译的预处理指令#ifdef M 意思是,如果定义了M这个符号,则条件为真,可以编译#ifdef到#endif的语句
1.常量条件编译
#if //常量表达式 //。。 #endif
表达式为真则执行编译
如果代码不想要了,也可以用这种方式进行 注释
2.多个分支的条件编译指令
#if 常量表达式 //... #elif 常量表达式 //... #else //... #endif
虽然两个条件都成立了,但是只会选其中一个,
如果#if没成立,#elif也没成立则会打印heihei
3.判断是否被定义的4种指令写法
嵌套条件编译预处理指令//判断是否定义了symbol
#if defined(symbol) //需要编译的的语句
#endif//判断是否定义了symbol
#ifdef symbol //需要编译的的语句
#endif//判断是否定义了symbol
#if !defined(symbol) //需要编译的的语句
#endif//判断是否定义了symbol
#ifndef symbol //需要编译的的语句
#endif
4.
#if defined(OS_UNIX)
#ifdef OPTION1
unix_version_option1();
#endif //结束OPTION1这个条件判断
#ifdef OPTION2
unix_version_option2();
#endif //结束OPTION2这个条件判断
#elif defined(OS_MSDOS)
#ifdef OPTION2
msdos_version_option2();
#endif //结束OPTION2这个条件判断
#endif//结束整个条件判断
文件包含类似于if
else
我们已经知道, #include 指令可以使另外一个文件被编译。就像它实际出现于 #include 指令的地方一样。
这种替换的方式很简单: 预处理器先删除这条指令,并用包含文件的内容替换。 这样一个源文件被包含10次,那就
实际被编译10次。
假如A写了两份代码,B和C都用了,最后D把B和C拼接在一起,等于使用了两次A代码
然后解决重复包含头文件?
条件编译:
每个源文件的开头的写
#ifndef __test_h__ #define __test_h__ //头文件内容 #include<> #endif
或者
#pragma once
就可以避免重复问题
#include<>与#include""区别// 库文件包含,C语言库中提供的函数的头文件使用<>或者"" #include#include"stdio.h" // 本地文件包含,自定义的函数的头文件使用"" #include"add.h" //<>与""的区别是: 查找的策略的区别 //""1.本代码所在的目录下查找,2.如果在本目录找不到则在库函数的头文件下查找 //<>直接去库函数头文件所在目录下查找
VS标准头文件路径:
C:Program Files (x86)Microsoft Visual Studio 9.0VCinclude
linux标准头文件路径:
/usr/include



