C语言预处理之二-----宏定义那点事儿

简介: 1、关于宏的副作用,请看下面代码:   #include stdio.h> #define GOODDEF (input+3) #define POORDEF input+3   //这里是宏的副作用最经典的例子,不穿裤子!!!如果你这样用,下面你就知错!!...
1、关于宏的副作用,请看下面代码:
 
  1. #include stdio.h>

  2. #define GOODDEF (input+3)
  3. #define POORDEF input+3   //这里是宏的副作用最经典的例子,不穿裤子!!!如果你这样用,下面你就知错!!

  4. int main()
  5. {
  6.     int input;
  7.     printf("input first number:");
  8.     scanf("%d",&input);
  9.     printf("after Mul,the 5*GOODDEF=%d,即5*(%d+3)\n",5*GOODDEF,input);

  10.     printf("input second number:");
  11.     scanf("%d",&input);
  12.     printf("after Mul,this 5*POORDEF=%d,即5*%d+3\n",5*POORDEF,input);

  13. // #undef GOODDEF

  14.     printf("input third number:");
  15.     scanf("%d",&input);
  16.     printf("after Mul,the 5*GOODDEF=%d,即5*(%d+3)\n",5*GOODDEF,input);

  17. }
执行效果
 
[root@localhost preProcess]# ./hello

input first number:8
after Mul,the 5*GOODDEF=55,即5*(8+3)
input second number:8
after Mul,this 5*POORDEF=43,即5*8+3
  (上一行出现该结果是因为上面宏定义不穿裤子造成的!!必须引以为戒
input third number:8
after Mul,the 5*GOODDEF=55,即5*(8+3)
[root@localhost preProcess]#
 
 
如果将源码中的 // #undef GOODDEF 打开,会编译出错,如下:
 
hello.c: 在函数‘main’中:
hello.c:21: 错误:‘GOODDEF’未声明(在此函数内第一次使用)
hello.c:21: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
hello.c:21: 错误:所在的函数内也只报告一次。)
 

  从上面的报警信息可以知道,因为GOODDEF 这个宏被撤消,搞得这个GOODDEF 变以了野宏的原因。

 
 
相关文章
|
1月前
|
编译器 C语言
C语言--预处理详解(1)
【10月更文挑战第3天】
|
1月前
|
编译器 Linux C语言
C语言--预处理详解(3)
【10月更文挑战第3天】
|
1月前
|
自然语言处理 编译器 Linux
【C语言篇】编译和链接以及预处理介绍(上篇)1
【C语言篇】编译和链接以及预处理介绍(上篇)
40 1
|
17天前
|
C语言
【c语言】你绝对没见过的预处理技巧
本文介绍了C语言中预处理(预编译)的相关知识和指令,包括预定义符号、`#define`定义常量和宏、宏与函数的对比、`#`和`##`操作符、`#undef`撤销宏定义、条件编译以及头文件的包含方式。通过具体示例详细解释了各指令的使用方法和注意事项,帮助读者更好地理解和应用预处理技术。
20 2
|
1月前
|
编译器 Linux C语言
【C语言篇】编译和链接以及预处理介绍(下篇)
【C语言篇】编译和链接以及预处理介绍(下篇)
32 1
【C语言篇】编译和链接以及预处理介绍(下篇)
|
1月前
|
C语言
C语言--预处理详解(2)
【10月更文挑战第3天】
|
1月前
|
编译器 C语言
C语言预处理详解
C语言预处理详解
|
1月前
|
存储 C语言
【C语言篇】编译和链接以及预处理介绍(上篇)2
【C语言篇】编译和链接以及预处理介绍(上篇)
36 0
|
3月前
|
存储 自然语言处理 程序员
【C语言】文件的编译链接和预处理
【C语言】文件的编译链接和预处理
|
3月前
|
程序员 编译器 C语言
C语言中的预处理指令及其实际应用
C语言中的预处理指令及其实际应用
86 0