c - 最有用的用户自定义 C 宏(在 GCC 中,也是 C99)?

标签 c macros c-preprocessor c99

<分区>

您认为哪个 C 宏最有用?我找到了以下一个,我用它在 C 中进行 vector 运算:

#define v3_op_v3(x, op, y, z) {z[0]=x[0] op y[0]; \
                               z[1]=x[1] op y[1]; \
                               z[2]=x[2] op y[2];}

它是这样工作的:

v3_op_v3(vectorA, +, vectorB, vectorC);
v3_op_v3(vectorE, *, vectorF, vectorJ);
...

最佳答案

#define IMPLIES(x, y) (!(x) || (y))

#define COMPARE(x, y) (((x) > (y)) - ((x) < (y)))
#define SIGN(x) COMPARE(x, 0)

#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*a))

#define SWAP(x, y, T) do { T tmp = (x); (x) = (y); (y) = tmp; } while(0)
#define SORT2(a, b, T) do { if ((a) > (b)) SWAP((a), (b), T); } while (0)

#define SET(d, n, v) do{ size_t i_, n_; for (n_ = (n), i_ = 0; n_ > 0; --n_, ++i_) (d)[i_] = (v); } while(0)
#define ZERO(d, n) SET(d, n, 0)

当然还有各种 MIN、MAX、ABS 等

请注意,顺便说一句,以上都不能通过 C 中的函数实现。

附言我可能会挑出上面的 IMPLIES 宏作为最有用的宏之一。它的主要目的是促进编写更优雅和可读的断言,如

void foo(int array[], int n) {
  assert(IMPLIES(n > 0, array != NULL));
  ...

关于c - 最有用的用户自定义 C 宏(在 GCC 中,也是 C99)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1772119/

相关文章:

c++ - 宏定义中的空 # 是什么意思?

macros - Elixir:在定义它的同一模块的主体中​​使用宏

c++ - 宏内的字符串连接

c++ - 如何将 C++ 宏转换为 typedef?

c - 打印二维数组名称和等级

c - 设计问题: Implementing a two way lookup table in C

macros - 克服 Rust 宏中的 "local ambiguity: multiple parsing options:"

检查宏内部的宏定义

c - mmap 在 Intel (i7) 和 Arm 上的不同行为?

c - Posix 线程消费者无法正确打印