C 预处理器令牌合并导致"indefined identifier"错误



我已经将我的问题简化为以下代码片段:

#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论坛本身中提出这个问题,知情者正在对此进行讨论,超出了我的经验所允许的范围:

  • Microchip XC8 论坛:合并令牌时 C 预处理器宏中的错误?

如果通过预处理器传递代码,则错误变得明显:

# 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)

问题解决了。

最新更新