【问题标题】:Preprocessor in C languageC语言预处理器
【发布时间】:2022-01-02 11:25:59
【问题描述】:

我想定义一个变量(Mode)在两个函数之间进行选择,但是编译器似乎没有做我想要的,这里是代码:

#include <stdio.h>
#define Mode dif

#if Mode == sum
    int function(int a, int b)
    {
        return a+b;
    }
#elif Mode == dif
    int function(int a, int b)
    {
        return a-b;
    }
#else
ERROR
#endif
int main()
{
    printf("%d",function(5,3));

    return 0;
}

编译器为我放入“Mode”的任何字符串值(或整数0)选择函数“sum”(或我写的第一个),并为我输入的任何整数选择“ERROR”状态0,这是我目前观察到的。

我可以通过用数字更改“sum”和“dif”来使其工作,但我正在从事另一个电子项目,在该项目中我必须使用单词而不是数字,否则将难以实施和诊断,例如:

#define Falling_Edge 0x00
#define Rising_Edge  0x01
#define Both         0x02
#define IT_Mode X // X could be Falling_Edge, Rising_Edge or Both

#if IT_Mode == Falling_Edge
// do something
#elif IT_Mode == Rising_Edge
// do something
#elif IT_Mode == Both
// do something
#elif
ERROR
#endif

请问有没有办法在 C 中实现这样的功能?

谢谢。

【问题讨论】:

  • 预处理器不这样做,这不是它的设计目的。尽管您评论了“另一个我必须使用单词而不是数字的电子项目”,但您没有说明使用数字会成为问题的任何理由。
  • 在 C 中你不能直接比较字符串。使用您拥有字符或整数的代码就可以正常工作。 this 的可能重复项。
  • Is there a way to achieve something like this in C please? 是的你can make it work by changing "sum" and "dif" with numbers。 (?)
  • 什么是电子项目,它如何影响这项任务?
  • 感谢您的 cmets,所以假设您必须制作一个与多个微控制器一起工作的项目,或者同一个项目可以用于做不同的事情,例如,如果您更改一个简单的计数器,然后数字可以使用相同的代码递增或递减。

标签: c preprocessor


【解决方案1】:

你不能以这种方式使用sumdif之类的符号,你需要将它们定义为数字:

#include <stdio.h>

#define sum 0
#define dif 1
#define Mode dif

#if Mode == sum
    int function(int a, int b)
    {
        return a+b;
    }
#elif Mode == dif
    int function(int a, int b)
    {
        return a-b;
    }
#else
    ERROR
#endif

int main(void)
{
    printf("%d\n",function(5,3));

    return 0;
}

【讨论】:

  • 该问题要求一种不使用数字的方法。所以用数字提供解决方案并不是正确的答案。
  • 这只是一个例子,假设你有多个函数,每个函数都有很多可能的情况,那么你能想象使用数字会有多困难吗?
  • @Vertinhol 通常这并不困难。在某些地方,您必须决定允许与哪些值进行比较。然后只需为每个值添加一个#define。为避免重复数字,您可以将所有这些定义放在一个地方。它在这个 sn-p 的顶部以及在你的问题中的第二个 sn-p 的顶部完成的方式是干净的,我不知道这将如何变得“困难”。这还提供了在定义 mode 宏时可以选择的所有允许值的列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2013-06-13
  • 1970-01-01
  • 2021-12-04
  • 2016-09-16
  • 2019-06-28
  • 1970-01-01
相关资源
最近更新 更多