C语言问题,宏定义中的参数为啥要定义,不是主函数中的参数直接替换吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言问题,宏定义中的参数为啥要定义,不是主函数中的参数直接替换吗?相关的知识,希望对你有一定的参考价值。

首先你要理解什么是预处理命令#define。它的作用是:在编译之前,对#define的参数在作用范围内进行替换操作。如:

#define A 2
int b = A; // 在编译之前,这行代码会被替换成: int b = 2;
所以#define只是替换,可没有定义相关的参数。用这道题来举个例子:
#define JH(a, b, t) t=a; a=b; b=t;
int t, a=1, b=2;
JH(a, b, t); // 在编译之前,这行代码会被替换成: t=a; a=b; b=t;
所以如果没有定义t,那么t=a; b=t; 就会报错。而且如果你没定义t,你又是如何使用
JH(a, b, t)呢?因为你必须写出第三个参数。还有就是要注意在最后它少加了一个分号:
#define JH(a, b, t) t=a; a=b; b=t // 题目中t后面没有分号
这是为了以函数的形式使用宏定义,同时也表明#define只是简单的替换,并不是执行代码。这样的用法是十分常见的。
参考技术A t并没有从主函数传递过来,所以没法不定义

关于C语言宏定义,这样为啥不行

如题,头文件的一部分:
#include <math.h>
#define HASHSIZE_Y (MAX_VTX_NUM <= 200) ? ((MAX_VTX_NUM <= 100 ) ? 41 : 67) \
: ((MAX_VTX_NUM <= 800) ? ((MAX_VTX_NUM <= 400) ? 101 : 167): ((MAX_VTX_NUM <= 1600) ? 269:347))(程序中占两行)
#define HASHSIZE_X (int)ceil(MAX_VTX_NUM / HASHSIZE_Y)

报错
改成这样:
#include <math.h>
#define HASHSIZE_Y 41
#define HASHSIZE_X 6
正确运行
改成这样

#include <math.h>
#define HASHSIZE_Y (MAX_VTX_NUM <= 200) ? ((MAX_VTX_NUM <= 100 ) ? 41 : 67) \
: ((MAX_VTX_NUM <= 800) ? ((MAX_VTX_NUM <= 400) ? 101 : 167): ((MAX_VTX_NUM <= 1600) ? 269:347))(程序中占两行)
#define HASHSIZE_X 6
不报错
但程序运行这一步时好像无限循环:
for (y=0;y<HASHSIZE_Y;y++)
hashArray[x][y]=NULL;
但是printf(“%d”,HASHSIZE_Y);值正确

因为<的优先级比?高。所以y<HASHSIZE_Y会是(y<(MAX_VTX_NUM <= 200)) ? ...
后面的表达式都是>0,所以无线循环。
可以在HASHSIZE_Y的外面再套一个()。追问

是的,这个我自己也搞明白了。程序已经调通,没用这么冗长的宏定义。
只是在想问下:像#define HASHSIZE_X (int)ceil(MAX_VTX_NUM / HASHSIZE_Y)

中ceil之类的库函数是不是不能在这里用?向下或向上取整有什么代替的办法?

追答

库函数可以用。

参考技术A 你在反人类吗?三目运算符套这么多,谁看都晕
宏定义这么用严重影响程序的大小和执行效率,你搞懂了也没有意义。

以上是关于C语言问题,宏定义中的参数为啥要定义,不是主函数中的参数直接替换吗?的主要内容,如果未能解决你的问题,请参考以下文章

关于C语言宏定义,这样为啥不行

c语言宏定义有无参数的区别

c语言宏定义

C语言带参数的宏定义:定义宏名时可以不写出参数???

C语言如何定义一个宏,可以有参数或无参数的调用

c/c++宏函数的定义与使用(宏定义函数)(macro definition)