情况
我正在使用 min GW 编译器:
>bin\cpp --version
cpp.exe (GCC) 6.1.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
我有两个头文件main.h
和submodule.h
. 由于各种原因,我不能简单地将其中一个标题包含到另一个标题中。
[更新]
我认为您需要解释为什么不能简单地将其中一个标题包含到另一个标题中的各种原因,因为这是显而易见的答案... – Andrew
我无法导入
main.h
,submodule.h
因为在这种情况下,更改main.h
会触发子模块的重新编译,尽管此处没有任何更改。编译时间是我的客户关心的主要问题。我不能包括在内
submodule.h
,main.h
因为submodule.h
定义了很多东西,但只有少数定义是公开的。我的客户希望尽可能减少标识符的可见性。我的客户端使用 的内容
main.h
来验证目标软件不同版本的兼容性。上述数组的存在和大小是兼容性标准之一。因此数组的定义必须留在main.h
有一些版本的目标软件根本没有子模块。因此,构建此子模块的文件可能存在也可能不存在。(对于我的客户)有很多开销来处理必须由其他人而不是我来完成的情况。所以我的客户也想限制“闪烁”文件的数量。
我还有很多其他*.h
文件包含main.h
但不包含submodule.h
,它们不应该在子模块中隐藏一些东西。
submodule.h
定义了很多在submodule.c
. 其中包括数组类型定义和该类型的全局变量:
typedef const char INDEX_TABLE_t[42];
const INDEX_TABLE_t INDEX_TABLE;
实现了这个submodule.c
数组:
const INDEX_TABLE_t INDEX_TABLE {/* 42 random char values */};
INDEX_TABLE
其他*.h
文件中使用的变量ist:
char SOME_OTHER_INDEX[23] = {/* 23 random char values */};
#define SELECTOR_VALUE 5
#define a_fix_name INDEX_TABLE[SOME_OTHER_INDEX[SELECTOR_VALUE]]
这些*.h
文件包括main.h
但不包括submodule.h
.
INDEX_TABLE_t
因此,我曾经添加和编译好的(完全相同的)类型定义INDEX_TABLE_t
。main.h
问题
我的客户使用了一个代码 alaysis 工具 (QA-C),它抱怨 type 的双重定义INDEX_TABLE_t
。
[C] More than one declaration of 'INDEX_TABLE_t' (with no linkage).
客户指示我更改代码,以便代码分析工具不再发出此错误。
我通常通过将extern
关键字添加到除一次之外的所有内容来解决此问题。但在这种情况下,编译器会抛出异常:
error: conflicting specifiers in declaration of 'INDEX_TABLE_t'
但是声明是相等的(它们是基于模型呈现的)。
问题
我有机会让编译器和代码分析器都开心吗?
我唯一的选择是创建另一个要包含在main.h
或所有其他文件中的头文件吗?*.h