• 预处理符号


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

  • 相关阅读:
    串口调适
    取出不重复的6个数
    个人Windows 10必备软件以及浏览器必装插件等
    合肥工业大学宣城校区2018年-2019年第一学期(大三上学期)物联网工程专业资料汇总(含课件、个人实验报告、实验代码、课设报告等)
    合肥工业大学宣城校区2019年-2020年第二(大三下)学期物联网工程专业资料汇总(含课件、个人实验报告、实验代码、课设报告等)
    合肥工业大学宣城校区2020年-2021年第一(大四上)学期物联网工程专业资料汇总(含课件、个人实验报告、实验代码、课设报告等)
    软件工程-单元测试-计算机测试-复习札记
    8086汇编计算分段函数值
    C语言是开源的吗?C++是开源的吗?C语言、C++是两个开源的标准,而不是开源软件或其它
    合肥工业大学编译原理实验LR(1)文法分析完整Scala实现代码(Java封装GUI)与测试数据
  • 原文地址:https://www.cnblogs.com/buxianghe/p/2803858.html
Copyright © 2020-2023  润新知