1

在我们的代码中删除旧宏的过程中,我需要将旧宏定义为带有有意义的编译器消息的错误。

例如,旧代码:

#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

正确的方法是什么?

4

3 回答 3

1

using 的问题#error在于,在预处理器分析部分代码时会产生错误。您想在宏展开时创建一个错误。不幸的是,你不能使用#error它。

我不相信有一种方法可以在可移植的 C 中可靠地生成清晰的人类可读的错误消息。(当然,您可以将宏扩展为语法上无效的内容,但这至少会停止编译。) gcc 支持使用_Pragma. 您的问题实际上等同于这个问题,并且那里的答案解释了如何使用_Pragma以及其他选项来创建致命错误。

于 2013-03-18T07:24:12.280 回答
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未定义的错误,并希望能给如何替换它提供足够的提示。

于 2013-03-19T04:22:00.493 回答
0

您不能使用预处理器指令,#define因为您要求的是两次运行预处理器。

如果一行以 an 开头,#则它是预处理器的指令并且将被解释。如果不存在,则如果存在这样的宏,则对其进行宏替换和替换。

您可以做的最好的事情是将已弃用的宏定义为肯定会返回错误的某些表达式。

于 2013-03-18T07:28:27.413 回答