如果使用定义,则生成预处理器错误
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,您使用这种方法,对于您的编译器,您使用您的编译器的方法,对于未知的编译器,您退回到提供宏定义的标准方法,这可能会导致困难-读取错误信息。
如果使用特定的 #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,您使用这种方法,对于您的编译器,您使用您的编译器的方法,对于未知的编译器,您退回到提供宏定义的标准方法,这可能会导致困难-读取错误信息。