至于在更大的项目上工作,我想加入一些自己的类型(例如 myType
)。 “突入”的方法是,将这些 typedef 放入 header 中(比方说 myType.h
),以及一组处理这些类型的函数。
如果我在某处使用新类型,我会将 myType.h
包含到我的源文件中。很好。
但是如果我想在某处使用新类型作为函数签名中的参数,我需要将 myType.h
包含到包含该函数的模块的 header 中。使用一个或另一个 typedef,这对我来说似乎没问题,但我拥有的类型越多,我需要的标题中包含的内容就越多,可能包括更多标题,同时使用类型包括其他自己的类型。这导致了我所说的“依赖 hell ”。
是否有一种聪明、时尚、最佳实践的方法来解决这个难题?
我知道可以将这些类型作为 void-pointer 传递,然后将它们强制转换回函数内部,但随后我从编译器中删除了重要的类型检查。
此外,extern
在这里被认为是最糟糕的做法。
编辑:
详细说明:
myType.h
:
#include "otherType.h"
typedef struct {
char Name[32];
int Size;
otherType someType;
} myType;
processSomeHow(myType _myType, int NewSize);
otherType.h
#define SOME_CONST 32
typedef struct { [...] } otherType;
someModule.h
:
#include "myType.h"
int specialProcessSomeHow(myType _myType);
someModule.c
:
int specialProcessSomeHow(myType _myType)
{
int Size = 64;
return(processSomeHow(_myType, Size));
}
现在我将 otherType.h
间接包含到 someModule.h
中,更糟糕的是,我将它包含到每个模块中,其中包括 someModule.h
。现在我到处都有 SOME_CONST
并且很难弄清楚它来自哪里。我必须维护两个包含树。
最佳答案
就像在 gtk 库中一样,您可以使用一个头文件并根据需要拆分它。
type.h
- myType.h
-- someType.h
- otherType.h
- List item
关于您的 CONST 问题: 如果你只需要一个 c.file。不要在 HeaderFile 中使用它们。 您可以将它们命名为“MY_TYPE_SOME_CONST”或“OTHER_TYPE_SOME_CONST”;
//编辑:
明确一点:只需添加“this.h”文件并命名即可。
#ifndef TYPE_H_
#define TYPE_H_
#include myType.h
#include someType.h
#include otherType.h
#endif /* TYPE_H_ */
现在您可以为每个需要类型的文件使用“#include this.h”。 (this.h 不是真实的,给它起一个独特的名字)
关于c - 如何在标题中不包含标题的情况下处理 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15611397/