【问题标题】:Special #define option in CC中的特殊#define选项
【发布时间】:2019-05-02 10:51:24
【问题描述】:

我有一个结构 A,其中 A 有字段 v0 和 v1。 有一个 A 数组:

A St[3];

我想这样定义 B:

#define B[x] St[x].v0 

我无法插入 x 作为要定义的参数。 有没有办法在 C 中做到这一点? 我的目的是能够用 B[x] 替换 St[x].v0 的每个实例。

【问题讨论】:

  • 请展示它,而不是描述您的代码。尝试创建您在问题中向我们展示的minimal reproducible example
  • 如果你使用括号而不是方括号,你可以这样做:#define B(x) St[x].v0
  • replace each instance of St[x].v0 with B[x] - 您提供的宏 #define B[x] St[x].v0 将用 B[x] 替换 St[x].v0(如果只允许在宏名称中使用 [)。请展示St[x].v0B[x] 的用法示例。无论如何,今天的课程:编写适当的抽象并使用访问函数。
  • 不是严格意义上的数组,但你可以像这样访问元素:B(i) = 42;a = B(j);
  • “它将最大程度地减少现有项目中的代码更改” - 您能否向我们提供更多信息?您所做的似乎不是最小化代码更改的最佳解决方案...

标签: c c-preprocessor


【解决方案1】:

根据the C reference#define的定义是

#define <identifier>[( parameters, ... )] [replacement-list]

您不得在&lt;identifier&gt; 中使用方括号(请参阅C99 standard),因此您建议的解决方案不会被预处理器正确处理。

什么会起作用的是

#define B(x) St[x].v0 // note the brackets

您将在其中将附加参数传递给宏(使用括号)。 但是,这会混淆您的代码,并且很可能会混淆您的代码的用户/读者。另见why you should be careful with macros

【讨论】:

    【解决方案2】:

    替代参数的宏称为类函数宏,C标准只规定类函数宏使用圆括号,不使用方括号。

    您可以使用以下方法:

    #define B(x) St[x].v0 
    

    【讨论】:

    • 您写道“#define 不支持数组/括号运算符”,但随后您显示了一个使用“数组/括号”运算符(正确称为 下标运算符)的#define )。我知道你的意思,但正在学习这些东西的人可能不会。答案需要使用能够向尚未理解的人清楚解释的语言。替换参数的宏称为类函数宏,C标准只提供使用圆括号而不是方括号的类函数宏。
    【解决方案3】:

    你可以拥有

    #define B(x) St[x].v0
    

    ant 然后将St[x].v0 的每个实例替换为B(x)

    恐怕用[] 是不可能的,你需要运算符重载(就像C++ 中的那样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多