C预处理程序令牌合并导致“未定义标识符”错误

时间:2016-07-13 02:08:11

标签: c-preprocessor

我已将问题简化为此代码段:

#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论坛中提出这个问题是值得的,而那些知情人士正在讨论它超出我的经验所允许的范围:

1 个答案:

答案 0 :(得分:-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)

问题解决了。