zoukankan      html  css  js  c++  java
  • 预处理符号

    一. #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++标准版本的不同而不同

  • 相关阅读:
    多线程循环打印ABC
    程序员如何提高影响力
    一文详解bundle adjustment
    粒子滤波到底是怎么得到的?
    多视图立体匹配论文分享CasMVSNet
    入坑slam,一位博士小姐姐的科研和成长分享(考研+读研+读博)
    【车道线检测】一种基于神经网络+结构约束的车道线检测方法
    FCGF-基于稀疏全卷积网络的点云特征描述子提取(ICCV2019)
    多视图立体匹配论文分享PVA-MVSNet
    姿态估计算法汇总|基于RGB、RGB-D以及点云数据
  • 原文地址:https://www.cnblogs.com/buxianghe/p/2803858.html
Copyright © 2011-2022 走看看