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

Generating a preprocessor error if a define is used

如果使用特定的 #define,C++ 预处理器是否可以发出 #error?像这样:

#define this_must_not_be_used #error You shouldn't use that.

你的意思是这样的吗:

#ifdef this_must_not_be_used
#error "You shouln't use that."
#endif

在 C++11 中,

#define this_must_not_be_used static_assert(false, "You shouldn't use that.");

在 C11 中,

#define _Static_assert(0, "You shouldn't use that.");

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

#define this_must_not_be_used ("You shouldn't use that",)

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

出于大多数实际目的,放置一些不可能成为有效 C(或 C++)程序一部分的内容就足够了。

不过,某些实现确实具有特定于实现的方法来准确实现您的要求。例如,对于 GCC,您可以使用

#pragma GCC poison this_should_not_be_used

无论它最终如何使用,它的后续使用将提供:

error: attempt to use poisoned "this_should_not_be_used"

您可能想查看您自己的编译器文档,看看是否有类似内容。您还可以使用条件宏定义,因此对于 GCC,您使用这种方法,对于您的编译器,您使用您的编译器的方法,对于未知的编译器,您退回到提供宏定义的标准方法,这可能会导致困难-读取错误信息。