复习C语言随笔 十一

复习C语言随笔 十一

命令行定义

许多C 的编译器提供了⼀种能⼒,允许在命令⾏中定义符号。⽤于启动编译过程。例如

#include 
int main()
{
 int array [ARRAY_SIZE];
 int i = 0;
 for(i = 0; i< ARRAY_SIZE; i ++)
 {
 array[i] = i;
 }
 for(i = 0; i< ARRAY_SIZE; i ++)
 {
 printf("%d " ,array[i]);
 }
 printf("\n" );
 return 0;
}

在linux系统中用gcc编译C代码时可以加上 -D 来对 ARRAY_SIZE 进行定义。

条件编译

#if 与 #ifdef

#define __DEBAG__ 0



#ifdef __DEBUG__          //①

#endif



#if defined(__DEBUG__)   //②

#endif

① 和 ② 效果一样

文件包含

#include<> 引用库函数的头文件
#include”” 引用自定义头文件
应当注意的是用 “” 时,先去源文件所在目录查找,若没找到就去库目录下查找。而 <> 直接去库目录下去寻找。所以其实也可以直接用 <> 引用库函数的头文件,但我们不这样做,是为了加快编译速度。

#error 预处理

#error 预处理指令的作用是,编译程序时,只要遇到 #error 就会生成一个编译错误提
示消息,并停止编译。其语法格式为:
#error error-message
注意,宏串 error-message 不用双引号包围。遇到#error 指令时,错误信息被显示,可能同时
还显示编译程序作者预先定义的其他内容

#line 预处理

#line 的作用是改变当前行数和文件名称,它们是在编译程序中预先定义的标识符
命令的基本形式如下:
#line number[“filename”]
其中[]内的文件名可以省略。
例如:
#line 30 a.h
其中,文件名 a.h 可以省略不写。
这条指令可以改变当前的行号和文件名,例如上面的这条预处理指令就可以改变当前的行号
为 30,文件名是 a.h。初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译
器的编写中,我们知道编译器对 C 源码编译过程中会产生一些中间文件,通过这条指令,
可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析

#pragma 预处理

#pragma message

message 参数:它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:
#pragma message(“消息文本”)
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。

#pragma code_seg

另一个使用得比较多的 pragma 参数是 code_seg。格式如:
#pragma code_seg( [“section-name”[,”section-class”] ] )
它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。

#pragma once

#pragma once
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在
Visual C++6.0 中就已经有了,但是考虑到兼容性并没有太多的使用它。

#pragma hdrstop

#pragma hdrstop 表示预编译头文件到此为止,后面的头文件不进行预编译。BCB 可以
预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,
所以使用这个选项排除一些头文件。
有时单元之间有依赖关系,比如单元 A 依赖单元 B,所以单元 B 要先于单元 A 编译。
你可以用#pragma startup 指定编译优先级,如果使用了#pragma package(smart_init) ,BCB
就会根据优先级的大小先后编译。

#pragma resource

#pragma resource “*.dfm”表示把*.dfm 文件中的资源加入工程。*.dfm 中包括窗体
外观的定义。

#pragma comment

#pragma comment(…)
该指令将一个注释记录放入一个对象文件或可执行文件中。
常用的 lib 关键字,可以帮我们连入一个库文件。 比如:
#pragma comment(lib, “user32.lib”)
该指令用来将 user32.lib 库文件加入到本工程中。
linker:将一个链接选项放入目标文件中,你可以使用这个指令来代替由命令行传入的或
者在开发环境中设置的链接选项,你可以指定/include 选项来强制包含某个对象,例如:
#pragma comment(linker, “/include:__mySymbol”)

#pragma warning

#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不显示 4507 和 34 号警告信息
#pragma warning(once:4385) // 4385 号警告信息仅报告一次
#pragma warning(error:164) // 把 164 号警告信息作为一个错误。
同时这个 pragma warning 也支持如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
这里 n 代表一个警告等级(1—4)。
#pragma warning( push )保存所有警告信息的现有的警告状态。
#pragma warning( push, n)保存所有警告信息的现有的警告状态,并且把全局警告
等级设定为 n。
#pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的
一切改动取消。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
//…….
#pragma warning( pop )
在这段代码的最后,重新保存所有的警告信息(包括 4705,4706 和 4707)

你可能感兴趣的:(C/C++,随笔,复习)