【问题标题】:C Preprocessor token merging results in "indefined identifier" errorC 预处理器标记合并导致“未定义的标识符”错误
【发布时间】:2016-07-13 02:08:10
【问题描述】:

我已将我的问题简化为这个 sn-p:

#define AND(a, b) a & b
#define VAL_FOO 0x0f
#define VAL_BAR 0x77
#define DO(v1, v2) AND(VAL_##v1, VAL_##v2)

void main()   // As it should be for XC8
{
    DO(FOO, BAR);
}

当我尝试编译时,我收到以下消息:

未定义标识符“VAL_FOO”

未定义的标识符“VAL_BAR”

都指向DO(FOO, BAR);这一行。

上面有什么问题?我只是无法理解它。我经常使用这种代码,我很困惑为什么它在这种情况下不起作用。例如,以下工作:

#define BAZ(a, A, B)                 \
    (AND(c_##a##_d[0], E) == F_##A##_G_##B)

我就是看不出区别!如果有什么不同,我正在使用 XC8 编译器为 PIC16F 微控制器编译 C

编辑:我认为值得在 XC8 论坛本身提出这个问题,而知情人士正在对此进行讨论,超出了我的经验:

【问题讨论】:

  • 如果我将最后一行更改为int main() { printf("%d\n", DO(FOO, BAR)); },对我来说效果很好。尝试发布MCVE
  • 完成。它仍然对我不起作用
  • 好吧,您现在发布的内容已编译,只是对我来说宏扩展时出现警告“无效声明”。似乎是您正在使用的编译器中的一个错误。
  • 用 XC8 编译?默认设置?我没有得到“没有效果的声明” - 作为一般规则,它不会过滤掉此类代码甚至发出警告,它假设操作由于 ISR、硬件更改和可能的手动插入程序集而具有副作用
  • 您可以尝试使用其他编译器的预处理器,然后再将其提供给有问题的编译器以解决问题...

标签: c-preprocessor


【解决方案1】:

如果你通过预处理器传递你的代码,错误就会变得很明显:

# 1 "<stdin>"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 328 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "<stdin>" 2

void main()   // As it should be for XC8
{
    VAL_##FOO & VAL_## BAR;
}

标记粘贴代码中的空格是有意义的。改成

#define DO(v1,v2) AND(VAL_##v1, VAL_##v2)

问题就解决了。

【讨论】:

  • 恐怕不行。完全相同的错误。不错的尝试
猜你喜欢
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 2014-06-05
  • 2015-05-12
  • 2012-02-26
  • 2011-10-23
相关资源
最近更新 更多