编译预处理一些知识简单总结

来源:互联网 发布:柠檬市场知乎 编辑:程序博客网 时间:2024/06/08 03:05

# 空指令,无任何效果
#include 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 如果给定条件为真,则编译下面代码
#ifdef 如果宏已经定义,则编译下面代码
#ifndef 如果宏没有定义,则编译下面代码
#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif 结束一个#if……#else条件编译块
#error 停止编译并显示错误信息 
------------------------------------------------------------------
关于#error 的详细解释:

编译程序时,只要遇到 #error 就会跳出一个编译错误,既然是编译错误,要它干嘛呢?其目的就是保证程序是按照你所设想的那样进行编译的。

下面举个例子:
程序中往往有很多的预处理指令
#ifdef XXX
...
#else

#endif

当程序比较大时,往往有些宏定义是在外部指定的(如makefile),或是在系统头文件中指定的,当你不太确定当前是否定义了 XXX 时,就可以改成如下这样进行编译:

#ifdef XXX
...
#error "XXX has been defined"

#else

#endif

这样,如果编译时出现错误,输出了XXX has been defined,表明宏XXX已经被定义了。


PS:
一、宏中“#”和“##”的用法:
        一般用法:使用“#”把宏参数变为一个字符串,用”##”把两个宏参数结合在一起

       例子:


#include <iostream>
using namespace std;

#define TEST1(x) (cout<<id##x<<endl);
#define TEST2(p) (cout<<#p<<endl);
int main()
{
    int id1 = 1001;
    int id2 = 1002;
    TEST1(1);    // == cout<< id1 << endl;
    TEST2(2);    // == cout<< "2" << endl;
    TEST1(2);    // == cout<< id2 << endl;

    system("pause");
    return 0;
}
二、防止一个头文件被重复包含
        #ifndef COMDEF_H
        #define COMDEF_H
        //头文件内容
        #endif
    当你所建的工程有多个源文件组成时,很可能会在多个文件里头包含了同一个头文件,如果借用上面的宏定义就能够避免同一个头文件被重复包含时进行多次编译。因为当它编译第一个头文件时总是没有定义#define COMDEF_H,那么它将编译一遍头文件中所有的内容,包括定义#define COMDEF_H。这样编译再往下进行时如果遇到同样要编译的头文件,那么由于语句#ifndef COMDEF_H的存在它将不再重复的编译这个头文件。

三、常用的宏定义
  __DATE__
  进行预处理的日期(“Mmm dd yyyy”形式的字符串文字)

  __FILE__
  代表当前源代码文件名的字符串文字

  __LINE__
  代表当前源代码中的行号的整数常量

  __TIME__
  源文件编译时间,格式微“hh:mm:ss”

原创粉丝点击