我已将问题简化为此代码段:
#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论坛中提出这个问题是值得的,而那些知情人士正在讨论它超出我的经验所允许的范围:
答案 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)
问题解决了。