Header排除?
Header exclusion?
简短描述:
Header.h
有 #include <stdbool.h>
,它在 c.
中有一个用于 _Bool 的宏
file.cpp
包括 Header.h
,但由于 file.cpp
是 C++ - 它具有 bool 作为本机类型。现在 lint 抱怨一系列事情(重新声明、non-existing 方法等)。有没有办法在不触及 Header.h
的情况下防止 <stdbool.h>
包含在 file.cpp
中?
如果我对问题的描述看起来很荒谬 - 请向我扔西红柿 :) 否则,感谢您的帮助。
编辑: 现在又想起来了:了解编译和链接的基本概念我应该已经意识到 'excluding' 一些 header 在下游 file/header 听起来很有趣,没有障碍是不可能的。但是,仍然感谢您的帮助。我理解这一点的另一个小问题。
您可以创建自己的 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 中并使用它来代替 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
简短描述:
Header.h
有 #include <stdbool.h>
,它在 c.
file.cpp
包括 Header.h
,但由于 file.cpp
是 C++ - 它具有 bool 作为本机类型。现在 lint 抱怨一系列事情(重新声明、non-existing 方法等)。有没有办法在不触及 Header.h
的情况下防止 <stdbool.h>
包含在 file.cpp
中?
如果我对问题的描述看起来很荒谬 - 请向我扔西红柿 :) 否则,感谢您的帮助。
编辑: 现在又想起来了:了解编译和链接的基本概念我应该已经意识到 'excluding' 一些 header 在下游 file/header 听起来很有趣,没有障碍是不可能的。但是,仍然感谢您的帮助。我理解这一点的另一个小问题。
您可以创建自己的 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 中并使用它来代替 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