我已经将我的问题简化为以下代码片段:
#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)
问题解决了。