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)替换为(…)可能的重复项