简短说明:
Header.h
有#include <stdbool.h>
,其中包含_Bool的宏。
file.cpp
包含Header.h
,但由于file.cpp
是C ++,因此它具有bool作为本机类型。现在lint抱怨一系列的事情(重新声明,不存在的方法等)。有没有办法阻止<stdbool.h>
加入file.cpp
而不触及Header.h
?
如果我对某个问题的描述看起来很荒谬 - 请向我扔西红柿:)否则,谢谢你的帮助。
编辑:现在再次考虑这个问题:了解编译和链接的基本概念我应该意识到“排除”下游文件/标题中的某些标题听起来很有趣,如果没有cludges就不应该这样做。但是,谢谢你的帮助。我对此的理解是另一个小砖。
答案 0 :(得分:10)
您可以创建自己的stdbool.h
并将其放在包含路径中,以便在系统之前找到它。这是技术上未定义的行为,但是你有一个损坏的<stdbool.h>
,所以这是解决这个问题的一种方法。您自己的版本可能是空的(如果它只包含在C ++文件中),或者如果您无法防止C文件也使用它,那么您可以这样做:
#if __cplusplus
# define __bool_true_false_are_defined 1
#elif defined(__GNUC__)
// include the real stdbool.h using the GNU #include_next extension
# include_next <stdbool.h>
#else
// define the C macros ourselves
# define __bool_true_false_are_defined 1
# define bool _Bool
# define true 1
# define false 0
#endif
更清洁的解决方案是在file.cpp
之前执行此操作包括Header.h
:
#include <stdbool.h>
// Undo the effects of the broken <stdbool.h> that is not C++ compatible
#undef true
#undef false
#undef bool
#include "Header.h"
现在,当Header.h
包含<stdbool.h>
时,它将无效,因为它已被包含在内。这种方式在技术上是无效的(见下面的评论),但实际上几乎可以肯定地工作。
需要在包含Header.h
的每个文件中完成,因此您可以将其包装在新标头中并使用该标头代替Header.h
,例如CleanHeader.h
包含:
#ifndef CLEAN_HEADER_H
#define CLEAN_HEADER_H
// use this instead of Header.h to work around a broken <stdbool.h>
# include <stdbool.h>
# ifdef __cplusplus
// Undo the effects of the broken <stdbool.h> that is not C++ compatible
# undef true
# undef false
# undef bool
#e ndif
# include "Header.h"
#endif