C++ 使用预处理指令检查是否包含标题?

C++ 使用预处理指令检查是否包含标题?,c++,c-preprocessor,C++,C Preprocessor,是否可以使用预处理指令测试文件是否包含在内 我想实现这样的目标: #ifincluded assert.h #error "Should not include assert.h" #endif 目前,我知道assert.h已经定义了\u assert\u h来解决这个问题。在这种情况下,我可以使用\ifdef\u ASSERT\u H。问题在于,这是特定于实现的 有更好的方法来实现这一点吗?您可以简单地利用assert()本身是一个宏这一事实,因此您只需执行 #ifdef assert #e

是否可以使用预处理指令测试文件是否包含在内

我想实现这样的目标:

#ifincluded assert.h
#error "Should not include assert.h"
#endif
目前,我知道
assert.h
已经定义了
\u assert\u h
来解决这个问题。在这种情况下,我可以使用
\ifdef\u ASSERT\u H
。问题在于,这是特定于实现的


有更好的方法来实现这一点吗?

您可以简单地利用
assert()
本身是一个宏这一事实,因此您只需执行

#ifdef assert
#error "Should not include assert.h"
#endif
当然,如果有人定义了自己的
assert
宏,这也会引起抱怨,严格来说,这是一件合法的事情

在一天结束时,我会重新考虑你到底想在这里做什么。如果您必须确保某人没有包含特定的标准标题,那么您很可能走错了路,如果您从一开始就后退一步并重新思考,很可能会找到一种更好但完全不同的方法。所以

有没有更好的方法来实现这一点


几乎可以肯定。但是它与检测和调整行为无关,这取决于是否包含了标准库的特定部分…

您可以简单地利用
assert()
本身是一个宏这一事实,因此您只需执行

#ifdef assert
#error "Should not include assert.h"
#endif
当然,如果有人定义了自己的
assert
宏,这也会引起抱怨,严格来说,这是一件合法的事情

在一天结束时,我会重新考虑你到底想在这里做什么。如果您必须确保某人没有包含特定的标准标题,那么您很可能走错了路,如果您从一开始就后退一步并重新思考,很可能会找到一种更好但完全不同的方法。所以

有没有更好的方法来实现这一点


几乎可以肯定。但它与检测和调整行为无关,这取决于是否包含了标准库的特定部分…

不,没有这种(标准化和可移植的)方法来检查已包含的头文件。这可能是XY问题。包含
assert.h
有什么问题,您试图阻止它?如果您需要标题,请包含它。不管它是否已经被转载进来了——头球后卫会处理好这件事,而且它的成本几乎为零。在你使用的地方包括你使用的东西——永远。在标准标题中的独特之处在于,它被设计为多次包含在同一翻译单元中,具有不同的语义(取决于是否在包含点定义了
NDEBUG
)。这使您可以打开或关闭不同代码区域的断言。这个问题是关于该头还是关于“普通”头的,可以多次包含,但总是意味着同一件事?@rkioji为什么您的自定义函数名为
assert
?为什么不选择一个与标准库不冲突的名称?不,没有这种(标准化和可移植的)方法来检查已经包含的头文件。这可能是一个XY问题。包含
assert.h
有什么问题,您试图阻止它?如果您需要标题,请包含它。不管它是否已经被转载进来了——头球后卫会处理好这件事,而且它的成本几乎为零。在你使用的地方包括你使用的东西——永远。在标准标题中的独特之处在于,它被设计为多次包含在同一翻译单元中,具有不同的语义(取决于是否在包含点定义了
NDEBUG
)。这使您可以打开或关闭不同代码区域的断言。这个问题是关于该头还是关于“普通”头的,可以多次包含,但总是意味着同一件事?@rkioji为什么您的自定义函数名为
assert
?为什么不选择一个与标准库不冲突的名称呢?我仍然希望使用assert的自定义实现,所以这对我不起作用。我需要一个指令来测试头是否已包含并引发编译错误。@rkioji为什么这对您不起作用?您担心
assert
的定义存在冲突,因此
#ifdef assert
应该非常完美。我希望assert函数存在。我只是不希望它是一个从标题。使用
#ifdef assert
,无论它是来自我的库还是来自std库。@rkioji我不理解这个问题。在库标题中,首先执行
#ifdef
检查,然后执行
#define assert mylib\u assert
@melpomene,因为已经是这样了。但是这会将assert关键字设置为
您想要的任何内容()
,直到我们再次包含
。我仍然希望使用assert的自定义实现,因此这对我不起作用。我需要一个指令来测试头是否已包含并引发编译错误。@rkioji为什么这对您不起作用?您担心
assert
的定义存在冲突,因此
#ifdef assert
应该非常完美。我希望assert函数存在。我只是不希望它是一个从标题。使用
#ifdef assert
,无论它是来自我的库还是来自std库。@rkioji我不理解这个问题。在库标题中,首先执行
#ifdef
检查,然后执行
#define assert mylib\u assert
@melpomene,因为已经是这样了。但是这会将assert关键字设置为
您想要的任何内容()
,直到我们再次包含
为止。