0

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

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

4

3 回答 3

1

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

首先要做的是(显然)尽可能限制全局命名空间中的名称数量。不要使用全局变量,仅使用静态变量,例如。

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

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

#define INP_SOMECONSTANT 4

typedef enum
{
  INP_THIS,
  INP_THAT,
} inp_something_t;

等等。每当这些项目在代码中的其他地方使用时,它们不仅有一个唯一的标识符,读者也很清楚它们属于哪个模块,因此它们有什么用途。因此,在修复命名空间冲突的同时,您可以获得可读性。

像上面这样的事情可能是实现正式编码标准的第一步,作为一名专业程序员,你迟早需要做的事情。

于 2012-11-06T22:26:11.267 回答
0

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

于 2012-11-06T22:33:10.780 回答
0

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

Basically what I did was to move the inclusion of the required stack header file to before the inclusion of our in-house type definitions file. Then, between those two includes I added a compiler macro to set a defined constant dependent on whether the stack's header file single-include protection definition has been defined. Then, I used that conditional defined constant as a conditional compile option in our in-house type definition file to prevent the conflicting data-types from being re-defined. It's a little sloppy, but progress can only be made in incremental steps.

于 2012-11-06T23:32:43.370 回答