随笔 - 147  文章 - 5  评论 - 6  阅读 - 81298

预处理符号

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

 

 

posted on   紫金树下  阅读(432)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2012年12月 >
25 26 27 28 29 30 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示