目录
3.4 命令行定义:
在VS编译器下不方便进行演示,所以在此使用Linux操作系统下的 gcc编译器进行演示:
所谓命令行定义即指,在命令行中定义符号、
如果直接去编译,则结果为:
或者编译指令可写成:
gcc -D M=10 test.c
此时,M=10和M=100,并不是在代码中定义的,而是在编译的时候指定的、
此时M就是在命令行中定义的,所以叫做命令行定义,在命令行中使用相关的参数去定义符号就叫做命令行定义,所以这种方法就可以不需要改
代码,通过命令行定义的方式来实现相应的功能、
在windows操作系统下的VS编译器中,虽然也有命令行参数,但是也是不可以的,不能成功编译,所以只能在Linux操作系统下的gcc编译器中才
可以使用上述方法去完成任务、
3.5 条件编译 :
所谓条件编译即指,设定一些条件,满足条件就进行编译,不满足条件就不进行编译,在编译一个程序的时候我们如果要将一条语句(一组语
句)编译或者放弃编译是很方便的。因为我们有条件编译指令、
条件编译指令就是预处理指令,如上图,假设符号PRINTF未进行定义,则 #ifdef PRINT 和 #endif 中间的内容就会在处理阶段被删除了,就相当
于是被注释掉了,因为注释在预处理阶段就会被删除,而这里如果不进行编译的话,在预处理阶段也会被删除,所以和删除注释是一样的,如果
该符号进行了编译,那么在预处理阶段就不会把这些内容删除,而是会被保留下来、
常见的条件编译指令:
一、单分支的条件编译:
#if 常量表达式 //... #endif //常量表达式由预处理器求值、 如: #define __DEBUG__ 1 #if __DEBUG__ //.. #endif
二、多个分支的条件编译:
#if 常量表达式 //... #elif 常量表达式 //... #else //... #endif
三、判断是否被定义:
#if defined(symbol) #if defined symbol #ifdef symbol #if !defined(symbol) #if !defined symbol #ifndef symbol
写法二中,符号TEST和符号HEHE可以不放在括号里,也是可以编译的,除此之外还可以对该 #if defined 后面的符号做&&或者是|| 处理、
符号EOF在stdio.h该头文件中、
四、嵌套指令:
#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
常量表达式:
所谓常量表达式即指:值不会改变并其在编译期间进行求值的表达式:
字面值:是一个不能改变的值,如数字、字符、字符串等,单引号内的是字符字面值,双引号内的是字符串字面值、
字面值类型(literal type):算数类型、引用和指针等、
1、字面值常量是常量表达式,如123,'a',3.14等等、
2、跟字面值常量相关的一些表达式,如123+3.14,2<<2等等、
3、用常量表达式初始化的const对象也是常量表达式,比如:int const a=5,或者是 const int a=5,由于5是常量表达式,拿着常量表达式初
始化的const修饰的对象,那么此const修饰的对象也是常量表达式,const修饰变量的时候,写成上面两种都是可以的,
const int a =1; //1是常量表达式,使用常量表达式初始化const修饰的对象时,该对象也是常量表达式, //所以a也是常量表达式、 cosnt int b=a+1; //1和a都是常量表达式,所以a+1也是常量表达式,使用常量表达式初始化const修饰的 //对象时,该对象也是常量表达式,所以b也是常量表达式、 int c=2; //初始值是字面值常量,但是对象c未被const修饰,所以c是变量而不是常量表达式,c //的类型是普通的int整型、 const int d=fun(); //fun()值要在运行时得到,虽然对象d被const修饰,但是初始值并不是常量表达式,所 //以,d也不是常量表达式。
3.6 文件包含:
当我们使用库函数或者是自定义函数的时候,往往要进行头文件的包含,则就需要使用预处理指令#include,它可以包含头文件、
3.6.1 头文件被包含的方式:
#include "filename"
/usr/include
E:\天津工业大学\VS2013\VC\include
由于符号EOF是包含在stdio.h头文件中的,可以通过该符号来找库函数提供的头文件stdio.h所在的位置,就可以找到标准位置了,右击符号
EOF,转到定义,在该页面中右击右上角的stdio.h,点击打开所在的文件夹就可以找到了、
库文件包含 :
#include <stdio.h>
查找策略:
直接到标准位置(库函数头文件的目录下,库函数头文件所在的路径下)查找该头文件,如果找不到就提示编译错误、
3.6.2 嵌套文件包含:
四、其他预处理指令:
常见的预处理指令有:#define、#if、#undef、#elif、#include、#ifdef、#endif、#ifndef、#else、#error、#pragma、#line等等,具体见C语言深
度剖析,其中,#pragma pack(4),设置默认对齐数为4,#pragma pack( ) === #pragma pack(8),,取消设置默认对齐数和设置默认对齐数是8
作用是一样的,因为,VS编译器下本来默认的对齐数就是8,除此之外还有:#pragma comment()等就不再一 一列举了、
关于程序环境和预处理的知识到此结束,感谢大家收藏加关注哦~