前言:
为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。
1. #error
#error 的作用是:编译程序时,只要遇到 #error 就生成一个编译错误提示,并停止编译。
//格式:
#error error-message
测试:
int main(void)
{
#define DEBUG_MODE
printf("Debug \r\n");
#undef DEBUG_MODE
#ifndef DEBUG_MODE
#error DEBUG_MODE is not define,please check
#endif
printf("main is running \r\n");
system("pause");
return 0;
}
上述的代码会触发 #error 错误,便于定位错误的代码位置。去掉 #undef DEBUG_MODE 后,上述程序可正常运行。
2. #line预处理
#line 的作用是改变当前行数和文件名称。
//格式:
#line number["filename"] //[]内的文件名可以省略
#line 30 a.h //a.h可以省略不写
解释:这条指令可以改变当前的行号和文件名。#line 30 a.h 即为改变当前的行号为 30 ,文件名为 a.h。通过这条指令,可以保证文件名是固定的,不会在编译的过程中被中间文件代替,有利于进行分析。
测试:
#include <stdio.h>
#line 5 "Test.c"
int main(int argc, char* argv[]){
#define CONST_NAME1 "CONST_NAME1"
printf("%s \r\n", CONST_NAME1);
#undef CONST_NAME1
printf("%s \r\n", CONST_NAME1);
{
#define CONST_NAME2 "CONST_NAME2"
printf("%s \r\n", CONST_NAME2);
}
printf("%s \r\n", CONST_NAME2);
system("pause");
return 0;
}
注:#line 5 “Test.c” 表示把当前行设置为第 5 行,并且文件名更改为 Test.c,编译后现象如下:出错行数在实际行数的上一行?
补:#line 指令改变 __ LINE__ 和 __ FILE__ 的内容。 __ LINE__ 和 __ FILE__ 都是编译程序中预定义的标识符。标识符 __ LINE__ 的内容是当前被编译代码行的行号,__ FILE__ 的内容是当前被编译源文件的文件名。其作用在于编译的时候,准确输出出错代码所在的位置(行号),而在源程序中并不出现行号,从而方便程序员准确定位。
3. #pragma预处理
#pragma 的作用是设置编译器的状态或者是指示编译器完成特定的动作。
#pragma para //para 为参数
3.1 #pragma message
message 参数:能够在编译信息输出窗口输出相应的信息,便于对源代码的控制。当编译器遇到这条指令时就在编译窗口将消息文本打印出来。
#pragma message("output information")
测试:
#include <stdio.h>
#define _X86
int main(int argc, char* argv[]){
#ifdef _X86
#pragma message("X86 macro activatede!")
#endif
system("pause");
return 0;
}
现象:
3.2 #pragma code_deg
设置程序中函数代码存放的代码段。
格式:
#pragma code_deg(["section-name"[,"section-class"]])
3.3 #pragma once
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,但是考虑到兼容性并没有太多的使用它。
#pragma once
3.4 #pragma hdrstop
#pragma hdrstop 表示预编译头文件到此为止,后面的头文件不进行预编译。(注意:是不进行预编译,而不是不进行编译)
BCB 可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,使用这个选项排除一些头文件。
有时单元之间有依赖关系,比如单元 A 依赖单元 B,所以单元 B 要先于单元 A 编译。可以用 #pragma startup 指定编译优先级,如果使用了 #pragma package(smart_init) ,BCB 就会根据优先级的大小先后编译。
3.5 #pragma comment
该指令将一个注释记录放入一个对象文件或可执行文件中。
格式:
#pragma comment(......)
#pragma comment("lib,"user32.lib") //将user32.lib 库文件加入到本工程中
linker:将一个链接选项放入目标文件中,可以使用这个指令来代替由命令行传入的或者在开发环境中设置的链接选项。例如指定 /include 选项来强制包含某个对象:
#pragma comment(linker, "/include:__mySymbol")