是否可以在 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(something)>42 这样的条件对于预处理器来说不是静态的。预处理器是纯文本的(原则上,算术除外)。它不知道 C 或类型。

    请注意,condition in #if 的表达式受到严重限制。

    但是,您可以使用构建技巧。例如,您可能有一个独立的程序,如

     // generate-sizeof.c
     #include <stdio.h>
     #include "foo-header.h"
    
     int main(int argc, char**argv) {
        const char* headername = NULL;
        if (argc<2)
          { fprintf(stderr, "%s: missing header name\n", argv[0]);
            exit(EXIT_FAILURE); };
        headername = argv[1];
        FILE *fh = fopen(headername, "w");
        if (!fh) { perror(headername); exit(EXIT_FAILURE); };
        fprintf(fp, "// generated file %s\n", headername);
        fprintf(fp, "#define SIZEOF_charptr %d\n", (int) sizeof(char*));
        fprintf(fp, "#define SIZEOF_Foo %d\n", (int) sizeof(Foo));
        fclose (fp);
     }
    

    然后有一个规则
     generated-sizes.h : generate-sizeof foo-header.h
         ./generate-sizeof generated-sizes.h
    

    在您的 Makefile 等中...

    因此,您的构建机器将生成适当的标题。

    如果你想交叉编译,事情会变得更加棘手!

    那么你的标题中可能有一个 #include "generated-sizes.h" ,然后是代码
    #if SIZEOF_Foo > 42
    #error cannot have such big Foo
    #endif
    

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

    10-11 21:30