Visual studio #将某物定义为#错误

Visual studio #将某物定义为#错误,visual-studio,macros,c-preprocessor,Visual Studio,Macros,C Preprocessor,在代码中删除旧宏的过程中,我需要使用有意义的编译器消息将旧宏定义为错误 例如,旧代码: #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 正确的方法是什么?使用#er

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

例如,旧代码:

#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

正确的方法是什么?

使用
#error
的问题是,在预处理器分析部分代码时会产生错误。要在宏展开时创建错误。不幸的是,您不能使用
#error
来实现这一点


我不相信有一种方法可以在portable C中可靠地生成清晰的人类可读的错误消息(当然,您可以将宏扩展到语法无效的地方,这至少会停止编译)。gcc支持使用
\u Pragma
执行此操作。您的问题实际上相当于,答案解释了如何使用
\u Pragma
以及创建致命错误的其他选项。

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

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


最好将不推荐使用的宏定义为肯定会返回错误的表达式。

宏不能有指令或更改预处理器状态。您可以保留未定义的
除以2
,但这样做无助于找到替换宏。可移植的唯一方法是将其定义为:

#define DIVIDE_BY_TWO error_DIVIDE_BY_TWO_is_obsolete_use_DIV_2_instead
这应该会给出一个错误,
error\u除以\u TWO\u是过时的\u使用\u DIV\u 2\u而不是未定义的
,希望这将给出足够的提示,说明如何替换它。

尝试将(x)替换为(…)可能的重复项