在我们的代码中删除旧宏的过程中,我需要将旧宏定义为带有意义的编译器消息的错误。
,例如,旧代码:
#define DIVIDE_BY_TWO(x) x/2
在新代码中,为防止使用此宏我想写:
#define DIVIDE_BY_TWO(x) #error DIVIDE_BY_TWO is obsolete, use DIV_2 instead
但是当我编译上面的代码时,我得到了:
error C2162: expected macro formal parameter
这样做的正确方法是什么?
答案 0 :(得分:1)
使用#error
的问题是在预处理器分析部分代码时会产生错误。您希望在扩展宏时创建错误。不幸的是,你不能使用#error
。
我不相信有可能在便携式C中可靠地生成清晰的人类可读错误消息。(当然,您可以将宏扩展为语法无效的东西,但至少会停止编译。)gcc支持使用_Pragma
进行编译。您的问题实际上等同于this question,其中的答案解释了如何使用_Pragma
以及其他选项来创建致命错误。
答案 1 :(得分:1)
宏不能有指令或更改预处理器状态。您可以保留DIVIDE_BY_TWO
未定义,但是找不到替换宏也无济于事。可移植的唯一方法是将其定义为:
#define DIVIDE_BY_TWO error_DIVIDE_BY_TWO_is_obsolete_use_DIV_2_instead
哪个应该给出error_DIVIDE_BY_TWO_is_obsolete_use_DIV_2_instead
未定义的错误,希望能提供足够的提示,如何替换它。
答案 2 :(得分:0)
您不能在#define
中使用预处理程序指令,因为您要求的是两次运行预处理程序。
如果一行以#
开头,则它是预处理器的指令并将被解释。如果没有,则如果存在这样的宏,则进行宏观替代和替换。
您可以做的最好的事情是将弃用的宏定义为一个肯定会返回错误的表达式。