我希望通过使用宏根据变量类型设置函数来实现c中的可选参数。
#define dostuff(BOOL) dostuffwithbool(BOOL)
#define dostuff(INT) dostuffwithint(INT)这种事有可能吗?(尽管我知道可能不是这样)。我愿意接受任何回答,不管是多长时间或多长时间。
发布于 2022-06-02 11:17:51
预处理器本身不能处理C类型,因为宏是在程序标记化后进行扩展的,但是分析了C语言的语法构造之前的。
根据应用程序的不同,您可以使用从_Generic获得的C11。它基本上是switch-case而不是类型。
#define dostuff(val) \
_Generic((val), bool: dostuffwithbool \
, int: dostuffwithint) (val)请注意,如果dostuffwithbool/dostuffwithint是类似于函数的宏,则此解决方案将无法工作。由于宏后面缺少(,宏将不会展开。
发布于 2022-06-02 14:02:46
您不能只使用宏本身,因为宏是占位符(用于预处理程序),而不是函数(子例程)。
预处理器用在宏定义处定义的代码替换所有出现的宏。像#define PI 3.141592654这样的数字定义也是一样的。在这里,PI是而不是变量。相反,代码中出现的每一个PI都将被3.141592654所取代。宏也是一样的。
因此,例如,这段代码具有一个简单的比较宏:
#include <stdio.h>
#define EQUALS(a, b) (a == b ? 1 : 0)
int main()
{
char nZero = 0;
char nOne = 1;
printf("0 is 0: %d\n", EQUALS(nZero, nZero));
printf("0 is 1: %d\n", EQUALS(nZero, nOne));
return 0;
}将由预处理器扩展到折叠代码:
int main()
{
char nZero = 0;
char nOne = 1;
printf("0 is 0: %d\n", (nZero == nZero ? 1 : 0));
printf("0 is 1: %d\n", (nZero == nOne ? 1 : 0));
return 0;
}注意:对宏要小心,因为它们将按照您在其定义中编写宏的方式展开。因此,例如,在计算周围放置括号是很好的做法,因为如下所示:
#define ADD(a, b) a + b
int x = a * ADD(b, c);将扩大到以下方面:
int x = a * b + c;而不这个:
int x = a * (b + c);https://stackoverflow.com/questions/72475285
复制相似问题