gpt4 book ai didi

c - 预处理器 #if 不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 05:05:39 24 4
gpt4 key购买 nike

我正在尝试用 C 编写一个通用的 printArray 函数,我可以用多个程序运行它,每个程序都有不同类型的数组。我这样做了:

#define TYPE int /* or char or double*/

void printArray(TYPE *a, int size){
for (int i=0; i<size; i++){
#if TYPE == int
printf("%d ", a[i]);
#elif TYPE == char
printf("%c ", a[i]);
#elif TYPE == double
printf("%f ", a[i]);
#endif
}
printf("\n");
}

我试过运行它,但无论 TYPE 被定义为什么,第一个 #if 总是 checkin ,意思是 - 如果 if 写成:

#if TYPE == int
printf("int");
#elif TYPE == char
printf("char");
#elif TYPE == double
printf("double");
#endif

然后它将打印“int”,即使 TYPE 被定义为 char,并且如果

#if TYPE == char
printf("char");
#elif TYPE == int
printf("int");
#elif TYPE == double
printf("double");
#endif

然后它将打印“char”,即使 TYPE 被定义为 int 等。

想法?

最佳答案

预处理器#if 计算整数表达式。您正在尝试将 == 视为比较标记。由于 int、char、double 等未定义为预处理器变量,因此它们的计算结果均为 0。

你可以做

#define TYPE int
#define FMT "%d"

void printArray(TYPE *a, int size){
for (int i=0; i<size; i++)
printf(FMT " ", a[i]);

printf("\n");
}

更简单,而且有效。

如果你只想指定类型,你可以做类似的事情

#define FMT_int "%d"
#define FMT_char "%c"
#define FMT_double "%f"
#define FMT PPCAT(FMT_, TYPE)

在我对 C/C++ Macro string concatenation 的回答中定义了 PPCAT

关于c - 预处理器 #if 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15678986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com