预处理符号

一. #define和 #undef

  #define这个预处理符号是大家常用的,主要用来定义一些常量和一些简单的表达式(函数),下面是一些例子

  #define TABSIZE 200

  int a[TABSIZE];int b[TABSIZE];

  经过预处理步骤,这时发生替换,上面两个定义就会变成 int a[200];int b[200];

  #undef是取消先前的#define 定义,如

  #define TABSIZE 100

  int a[TABSIZE];

  #undef TABSIZE

  #define TABSIZE 200

  int b[TABSIZE]

  经过预处理步骤后就是 int a[100]; int b[200];

  函数宏定义接受2个特殊的处理符号#和 ##

  #号的意思是把它后面参数的值用字符串的形式表达,例如

  1.#define get(x) #x

  2.cout<<get(222);---->cout<<#222--->cout<<"222";

  ##号的意思是把2个参数合并连接到一起,消除它们中间的空白符,例如

  1.#define glue(x,y)  x ## y

  2. cout<<glue(yishi,haoxuexiao);----->cout<<yishi ## haoxuexiao--------->cout<<"yishihaoxuexiao"

二:条件定义

  主要包括: #ifdef ,#ifndef,#if ,#endif,#else,#elif,主要用来进行条件编译

  #ifdef  TABSIZE

  int a[TABSIZE]

  #endif

  在上例中,如果先前定义了TABSIZE,那么就回定义数组a,如果没有定义TABSIZE,那么数组a的定义就不会被执行(编译阶段)

  #ifndef TABSIZE

  #define TABSIZE 100

  int a[TABSIZE]

  #endif

  在上例中,如果没有定义TABSIZE,那么自己定义TABSIZE=100,接着定义数组a,如果已经定义了TABSIZE,那么就不会定义数组a了

  另外 #ifdef X===#if defineed X,#ifndef X===#if !defineed X

  #if 常量表达式,例如  #if 20>30

三; #line  number filename

  当我们编译程序,程序有错误时,会输出错误的行数和文件名,#line定义就是结合了这两个,例如文件 test.c,

  1.#include<stdio.h>

  2.int main(void)

  3.{

  4.  int i?;

  5.  return 0;

  6.}

  上面这个程序是有错误的,编译提示的错误是:

  test.c: In function ‘main’:
  test.c:4:7: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘?’ token
  test.c:4:7: error: expected expression before ‘?’ token
  此时我们看到提示的错误信息有以下几项:1.文件名字,是test.c,每行都有 2.错误的行数,我们可以看到是第四行出现了错误(总共7行,最后有1行是空)

  我们对程序进行修改

  1.#include<stdio.h>

  2.int main(void)

  3.{

  4.     #line 1 " 我的文件"

  5.  int i?;

  6.  return 0;

  7.}

  编译的结果是:

  我的文件: In function ‘main’:
  我的文件:1:7: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘?’ token
  我的文件:1:7: error: expected expression before ‘?’ token

  我们可以看到文件名变化了,同时错误指向了第1行,那么 #line 1的作用就是把它下一行的代码行数从1开始计数;  另外filename是可选的,即#line number就OK

四:#error  expression

  这个定义是用来终止编译过程的

  #idndef __cplusplus

  #error 需要c++编译器

  #endif

  当我们使用gcc时(c++编译器默认定义__cplusplus),因为没有定义__cplusplus,那么就会执行#error ...,这个表达式就会终止编译器

 五:#include

  这个大家都熟悉了,主要有两种形式  #include<>和#include""

六:#pragma

  这个根据具体的编译器和平台的不同参数不同,主要是对编译的一些参数的配置

七:任何时候都被定义的宏

  __LINE__:这个指明被编译文件的现在在哪一行

  __FILE__:指明被编译文件的名字

  __DATE__:以MM DD YYYY的形式指明现在的编译日期

  __TIME__:以hh:mm:ss的形式指明现在的编译时间

  __cplusplus:所有c++编译器都应该定义的常量。兼容c++标准的编译器中,这个值是>=199711L,根据符合c++标准版本的不同而不同

原文地址:https://www.cnblogs.com/buxianghe/p/2803858.html