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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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语言的宏定义 if defined