是否可以在 C99 中实现 static_if?
#define STATIC_IF(COND, ...) \
if (COND) MACRO1(__VA_ARGS__); \
else MACRO2(__VA_ARGS__);
如何在此处正确实现 STATIC_IF(...)
?根据 COND
,参数应该传递给 MACRO1
或 MACRO2
,但两个宏的参数看起来不同。 COND
是静态可测试的,类似于 sizeof (…) > 42
。
#if COND
然后#define STATIC_IF MACRO1
… 不适用于我的用例。- 我不能使用特定于编译器的解决方案。
最佳答案
在您的具体情况下(如果我正确理解您的意见),是的,您可以这样做。
您不能将 sizeof
传递给预处理器中的任何内容,因为预处理器在类型信息可用之前运行。幸运的是,您不需要 sizeof
来计算静态编写列表 ( X-Y alert! ) 中参数的数量,因此这不是障碍。
这是使用 Order 的一种可能实现方式宏库:
#include <stdio.h>
#include <order/interpreter.h>
void oneArg(int a) {
printf("one arg: %d\n", a);
}
void twoArgs(int a, int b) {
printf("two args: %d %d\n", a, b);
}
void threeArgs(int a, int b, int c) {
printf("three args: %d %d %d\n", a, b, c);
}
#define ORDER_PP_DEF_8function_list \
ORDER_PP_CONST(("unused") \
(oneArg) \
(twoArgs) \
(threeArgs))
#define SelectFunction(...) ORDER_PP ( \
8seq_at(8tuple_size(8((__VA_ARGS__))), 8function_list) \
)
#define Overloaded(...) SelectFunction(__VA_ARGS__)(__VA_ARGS__)
int main(void) {
Overloaded(42);
Overloaded(42, 47);
Overloaded(42, 47, 64);
return 0;
}
(这个简单的例子通过参数的数量索引一个列表 - 可能不是你想要做的,但足以理解这个想法。Order 确实提供了一系列复杂的,非评估的控制结构 - if
、cond
、match
等 - 用于更复杂的决策。)
订单相当重量级:我假设您可以使用更轻、更便携的 P99(不熟悉它)来做类似的事情。 Order 与 GCC 配合得很好,与 Clang 配合得很好(Clang 会在深度递归或长循环中阻塞); 它 是标准的,但并非所有编译器都是。
关于c - C99 预处理器中的 static_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22505633/