首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C预处理器中的Typechecking

C预处理器中的Typechecking
EN

Stack Overflow用户
提问于 2022-06-02 11:10:16
回答 2查看 134关注 0票数 1

我希望通过使用宏根据变量类型设置函数来实现c中的可选参数。

代码语言:javascript
复制
#define dostuff(BOOL) dostuffwithbool(BOOL)
#define dostuff(INT) dostuffwithint(INT)

这种事有可能吗?(尽管我知道可能不是这样)。我愿意接受任何回答,不管是多长时间或多长时间。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-02 11:17:51

预处理器本身不能处理C类型,因为宏是在程序标记化后进行扩展的,但是分析了C语言的语法构造之前的。

根据应用程序的不同,您可以使用从_Generic获得的C11。它基本上是switch-case而不是类型。

代码语言:javascript
复制
#define dostuff(val)                    \
  _Generic((val), bool: dostuffwithbool \
                , int:  dostuffwithint) (val)

请注意,如果dostuffwithbool/dostuffwithint是类似于函数的宏,则此解决方案将无法工作。由于宏后面缺少(,宏将不会展开。

票数 2
EN

Stack Overflow用户

发布于 2022-06-02 14:02:46

您不能只使用宏本身,因为宏是占位符(用于预处理程序),而不是函数(子例程)。

预处理器用在宏定义处定义的代码替换所有出现的宏。像#define PI 3.141592654这样的数字定义也是一样的。在这里,PI而不是变量。相反,代码中出现的每一个PI都将被3.141592654所取代。宏也是一样的。

因此,例如,这段代码具有一个简单的比较宏:

代码语言:javascript
复制
#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;
}

将由预处理器扩展到折叠代码:

代码语言:javascript
复制
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;
}

注意:对宏要小心,因为它们将按照您在其定义中编写宏的方式展开。因此,例如,在计算周围放置括号是很好的做法,因为如下所示:

代码语言:javascript
复制
#define ADD(a, b) a + b
int x = a * ADD(b, c);

将扩大到以下方面:

代码语言:javascript
复制
int x = a * b + c;

这个:

代码语言:javascript
复制
int x = a * (b + c);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72475285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档