c - C99 预处理器中的 static_if

标签 c c99 c-preprocessor static-if

是否可以在 C99 中实现 static_if?

#define STATIC_IF(COND, ...) \
     if (COND) MACRO1(__VA_ARGS__); \
     else MACRO2(__VA_ARGS__);

如何在此处正确实现 STATIC_IF(...)?根据 COND,参数应该传递给 MACRO1MACRO2,但两个宏的参数看起来不同。 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 确实提供了一系列复杂的,非评估的控制结构 - ifcondmatch 等 - 用于更复杂的决策。)

订单相当重量级:我假设您可以使用更轻、更便携的 P99(不熟悉它)来做类似的事情。 Order 与 GCC 配合得很好,与 Clang 配合得很好(Clang 会在深度递归或长循环中阻塞); 是标准的,但并非所有编译器都是。

关于c - C99 预处理器中的 static_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22505633/

相关文章:

c++ - "const"只是意味着只读还是更多?

c - 我对堆栈框架结构有疑问?

c - 有没有办法检查是否在堆栈/堆上创建了可变长度数组?

c++ - 为什么需要间接寻址

c - SDL "dropping"初始事件?

c - AVR ATmega48的中断编程

c - VS2013对C99支持的官方状态是什么?

c - C9 9's "restrict"关于指向指针的指针的语义是什么?

c-preprocessor - 预处理器指令 : #elif not defined?

c - 带有可变长度尾部的普通 "C"静态初始化程序宏。