如何防止符号重新定义

时间:2012-11-06 21:59:21

标签: c eclipse typedef redefinition codewarrior

我的项目包含一个堆栈,它有许多用户定义的类型(typedef)。问题是许多这些类型定义与我们的内部类型定义冲突。也就是说,使用相同的符号名称。有什么方法可以防止这种情况发生吗?

问题的根源是在我们的应用程序或包装器代码中使用堆栈(视情况而定),必须包含某个头文件。该堆栈头文件又包括堆栈提供程序的类型定义文件。那就是问题所在。他们应该通过非公共包含路径包含他们的类型定义文件,但他们没有。现在,对于非常常见的名称存在各种用户定义的类型冲突,例如BYTEWORDDWORD等。

3 个答案:

答案 0 :(得分:1)

由于您可能无法轻易更改正在使用的程序堆栈,因此您必须从自己的代码开始。

要做的第一件事(显然)是尽可能地限制全局命名空间中的名称数量。不要使用全局变量,只使用静态变量作为示例。

下一步是为代码模块采用命名约定。假设您在项目中有一个“输入模块”。然后,您可以为输入模块“inp”中的所有函数添加前缀。

void inp_init (void); 
void inp_get  (int input);

#define INP_SOMECONSTANT 4

typedef enum
{
  INP_THIS,
  INP_THAT,
} inp_something_t;

等等。每当这些项目在代码中的其他地方使用时,它们不仅具有唯一的标识符,对于读者来说,它们所属的模块也是显而易见的,因此它们具有什么目的。因此,在修复名称空间冲突时,您可以同时获得可读性。

上述内容可能是实施正式编码标准的第一步,无论如何,作为专业程序员,您迟早需要这样做。

答案 1 :(得分:0)

我建议你定义一个包装头,它根据你自己的类型重新定义堆栈导出的所有函数和结构。然后,此标头包含在系统文件中,但不包含在堆栈文件中(它会发生冲突)。然后你可以编译和链接,但接口有一个弱点。如果您在重新定义中正确选择了类型,它应该可以正常工作,从堆栈供应商的每次更新中只留下 维护问题......

答案 2 :(得分:0)

我认为我暂时提出了一个合理的解决方法,但正如Lundin所说,长期解决方案需要正式的编码标准。

基本上我所做的是在包含我们的内部类型定义文件之前将所需的堆栈头文件包含在内。然后,在这两个包括之间我添加了一个编译器宏来设置一个定义的常量,这取决于是否已经定义了堆栈的头文件单包含保护定义。然后,我在我们的内部类型定义文件中使用该条件定义常量作为条件编译选项,以防止重新定义冲突的数据类型。这有点草率,但只能以渐进的步骤进行。