我经常使用带有条件的宏,它们确实有合法用途。
我有一些本质上是 blob 的结构,一切都只是一个 uint8_t 流。
为了使内部结构更具可读性,我有条件宏。
例子...
#define MAX_NODES 10
#define _CVAL16(x)(((x) <= 127) ? (x) : ((((x) & 127) | 0x80) ), ((x) >> 7)) // 1 or 2 bytes emitted <= 127 = 1 otherwise 2
现在要在数组中使用宏...
uint8_t arr_cvals[] = { _CVAL16(MAX_NODES), _CVAL16(345) };
数组中发出三个字节,第一个宏发出 1,第二个宏发出 2 个字节。这是在编译时评估的,只是使代码更具可读性。
我也有……例如……
#define _VAL16(x) ((x) & 255), (((x) >> 8) & 255)
对于最初的问题......也许这个人想要使用带有常量的结果,但再次真正归结为在哪里以及如何使用它。
#define SUM_A(x, y) (!(x) || !(y)) ? 0 : ((x) * (x) / ((x) + (y)) * (y))
float arr_f[] = { SUM_A(0.5f, 0.55f), SUM_A(0.0f, -1.0f), SUM_A(1.0f, 0.0f) };
在运行时可以有...
float x;
float y;
float res = SUM_A(x,y); // note ; on the end
我有一个程序可以创建作为代码包含在 C 程序中的字体,并且大多数值都包含在将 32 位值拆分为 4 个字节、浮动为 4 个字节等的宏周围。