是否可以在 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(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/