命令行定义
许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。 例如:当我们根据同一个源文件要 编译出不同的一个程序的不同版本的时候,这个特性有点用处。(假定某个程序中声明了一个某个长度的数组,如果 机器内存有限,我们需要一个很小的数组,但是另外一个机器内存大写,我们需要一个数组能够大写。)
在gcc进行编译
#include <stdio.h>
int 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]);
}
printf("\n");
return 0;
}
可以看到,代码中没有明确定义数组的大小。在编译这种代码时,我们需要使用命令行对数组的大小进行定义。
例如,在Linux环境下,编译指令如下:
gcc -D test.c MAX = 10
给test.c 定义一个MAX=10
条件编译
条件编译即满足条件则进行编译,不满足条件则不编译
在编译一个程序的时候我们如果要将一条语句(一组语句)编译或者放弃是很方便的。因为我们有条件编译指令。
比如说: 调试性的代码,删除可惜,保留又碍事,所以我们可以选择性的编译
#include <stdio.h>
#define M 10
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i < 10; i++)
{
arr[i] = i;
#ifdef M
printf("%d\n", arr[i]);
#endif
}
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
#ifdef OPTION2
unix_version_option2();
#endif
#elif defined(OS_MSDOS)
#ifdef OPTION2
msdos_version_option2();
#endif
#endif
类似于if else
文件包含
我们已经知道, #include 指令可以使另外一个文件被编译。就像它实际出现于 #include 指令的地方一样。 这种替换的方式很简单: 预处理器先删除这条指令,并用包含文件的内容替换。 这样一个源文件被包含10次,那就 实际被编译10次。
假如A写了两份代码,B和C都用了,最后D把B和C拼接在一起,等于使用了两次A代码 然后解决重复包含头文件?
条件编译: 每个源文件的开头的写
#ifndef __test_h__
#define __test_h__
#endif
或者
#pragma once
就可以避免重复问题
#include<>与#include""区别
#include<stdio.h>
#include"stdio.h"
#include"add.h"
VS标准头文件路径:
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include
linux标准头文件路径:
/usr/include
|