【发布时间】: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