c语言的宏定义学习笔记

宏定义

在预处理之前,c预处理器会对代码进行翻译,譬如用blank替换注释,去掉多余的空格,删除末尾的\来拼接行等。

 例如:

    int /*注释*/ x;

会被翻译成

   int x;

  printf("this is a s\

  entence.");

会被翻译成

printf("this is a sentence.");

这之后,将会处理预处理指令

每个#define由3部分组成:指令#define本身、缩略语(宏)、替换列表(主体)。

 

 

#define FOUR 2*2

#define FOUR 2 * 2

#define FOUR 2    *    2

上面后2个是相同的,替换列表有3个语言符号,因为用空格分割开了,而第一个是一个语言符号2*2

 

在#define可以使用参数

例如:

 #define SQUARE(X) X*X

表示求面积

int area = SQUARE(3);

area = 9

但是 int area2 = SQUARE(3+1);

area2 = 7

因为area2 = 3+1*3+1

宏定义我简单理解是先被解释成一段新的简单的字符串代码,再去编译这段代码,调用宏就是调用这段代码。作为java程序员我理解就是bsh干的事。

 

利用宏参数创建字符串

使用#,例如:

#define SQUARE(x) printf("the square of " #x " is %d.\n",((x)*(x)))

int a = 10;

SQUARE(a);

输出:the square of a is 100.

 

使用##,例如:

#define XN(n) x ## n

int XN(2) = 10;

printf("the value is %d.\n",x2);

输出:the value is 10.

 

宏还是函数?

有的编译器宏只能定义成1行

宏产生内联代码,增加了编译后的代码量

宏不检查类型

 

其它宏

#ifdef

#ifndef

#if

#else

#elif

#endif

上面的意思很明显,不过在使用的过程中要注意缩进

#if A == 1

  #define B 1

#elif A == 2

  #define B 2

#else

  #define B 12

#endif

#line 用于重置行和文件信息

#line 1000 //当前行号重置为1000

#line 10 "test.c" //把行号重置为10,文件名重置为test.c

#error 用于给出错误信息

#if 条件

  #error 错误信息

#endif

#pragma 想编译器发出指令

#pragma 命令

posted @ 2012-12-10 18:15  天空的凝望  阅读(345)  评论(2编辑  收藏  举报