【问题标题】:#defining something as #error#将某些东西定义为#error
【发布时间】:2013-03-18 07:11:05
【问题描述】:
在我们的代码中删除旧宏的过程中,我需要用有意义的编译器消息将旧宏定义为错误。
例如,旧代码:
#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
正确的做法是什么?
【问题讨论】:
标签:
visual-studio
macros
c-preprocessor
【解决方案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】:
使用#error 的问题在于,在预处理器分析部分代码时会产生错误。您想在宏展开时创建一个错误。很遗憾,您不能为此使用 #error。
我不相信有一种方法可以在便携式 C 中可靠地生成清晰的人类可读错误消息。(当然,您可以将宏扩展为语法上无效的内容,但这至少会停止编译。)gcc 支持使用_Pragma 进行编译。您的问题实际上等同于this question,那里的答案解释了如何使用_Pragma 以及创建致命错误的其他选项。
【解决方案3】:
您不能在#define 中使用预处理器指令,因为您要求的是运行预处理器两次。
如果一行以# 开头,则它是预处理器的指令,将被解释。如果不存在,则如果存在这样的宏,则对其进行宏替换和替换。
您可以做的最好的事情是将已弃用的宏定义为肯定会返回错误的某些表达式。