如果使用define,则生成预处理器错误

Tim*_*mmm 0 c c++ c-preprocessor

是否有可能使用C++预处理器发出#error一个特定#define的使用?像这样的东西:

#define this_must_not_be_used #error You shouldn't use that.
Run Code Online (Sandbox Code Playgroud)

Win*_*ute 6

在C++ 11中,

#define this_must_not_be_used static_assert(false, "You shouldn't use that.");
Run Code Online (Sandbox Code Playgroud)

在C11中,

#define _Static_assert(0, "You shouldn't use that.");
Run Code Online (Sandbox Code Playgroud)

对于C11之前的C或C++之前的C++,您必须考虑一些其他无效表达式,其中包含将在错误消息中显示的字符串.我正在思考

#define this_must_not_be_used ("You shouldn't use that",)
Run Code Online (Sandbox Code Playgroud)


小智 5

没有一种定义宏的标准方法,无论其在哪里使用,宏都会给您带来编译错误,尤其是没有给出清晰有用的错误消息的宏。众所周知,使用它的代码可能只是对结果进行字符串化处理,或者可能是assert预处理器删除的条件的一部分。

对于大多数实践目的,放置可能不能成为有效C(或C ++)程序一部分的东西就足够了。

但是,某些实现确实具有特定于实现的方法,可以准确地实现您的要求。例如,在GCC中,您可以使用

#pragma GCC poison this_should_not_be_used
Run Code Online (Sandbox Code Playgroud)

无论其最终使用方式如何,其后续使用将在以下方面提供:

错误:尝试使用中毒的“ this_should_not_be_used”

您可能需要查看自己的编译器文档,以查看其是否具有相似之处。您还可以使用条件宏定义,以便在GCC中使用此方法,在编译器中使用编译器的方法,对于未知的编译器,则退回到提供宏定义的标准方法,这可能会导致困难。 -读取错误消息。