我想知道是否有办法可以将.h文件编写为函数原型,并且在实现中更改签名,因此它与原型略有不同。
我想要这样做的原因是因为有一些枚举类型的#include我不想在.h文件中做,但只在.c文件中,并且枚举是函数的一部分签名,所以我想知道我是否可以将枚举编写为INT(枚举和int基本相同..)或原型中的某些东西,但后来我得到了编译错误.. 我能做到这么好吗?
提前致谢..
答案 0 :(得分:6)
如果我理解正确,你总是可以创建一个包装函数,例如
file.h
void DoSomething(int i);
file.cpp
void DoSomething(int i)
{
ActuallyDoSomething((MyEnum)i);
}
static void ActuallyDoSomething(MyEnum myEnum)
{
// Do something
}
如果是OOP程序,它可能如下所示:
file.h
class ISomething
{
virtual void DoSomething(int i) = 0;
};
file.cpp
class Something : ISomething
{
private:
void ActuallyDoSomething(MyEnum myEnum)
{
// ...
}
public:
void DoSomething(int i)
{
ActuallyDoSomething((MyEnum)i);
}
}
编辑:回应评论:我建议提供一个函数重载。
file.h
void DoSomething(int i);
void DoSomething(MyEnum myEnum);
file.cpp
void DoSomething(int i)
{
DoSomething((MyEnum)i);
}
void DoSomething(MyEnum myEnum)
{
// Do something
}
最终编辑:此解决方案无需使用C ++ 11即可运行。
file.h
#pragma once
enum MyEnum;
void DoSomething(int i);
void DoSomething(MyEnum enum);
FileWithMyEnum.h
#pragma once
enum MyEnum
{
One,
Two,
Three
};
file.cpp
#include <file.h>
#include "FileWithMyEnum.h"
// Implementations
答案 1 :(得分:1)
如果它是C ++,我猜你可以使用函数重载。
file.h
void DoSomething(int i);
file.cpp
void DoSomething(MyEnum myEnum)
{
// Do something
}
void DoSomething(int i)
{
DoSomething((MyEnum)i);
}
我暂时没有使用过C ++。因此,不是100%确定这是否会按预期工作。
答案 2 :(得分:1)
我将概述如何创建前向声明标头。 <iosfwd>
可能很熟悉这种技术,它从<iostreams>
向前宣布了有用的东西。请注意,只有C ++ 11允许您转发声明枚举。
huge_header_with_e.h
enum E { Zero, One, Two };
great_lib_fwd.h
enum E;
void f(E);
great_lib.h
#include "great_lib_fwd.h"
#include <huge_header_with_e.h>
void f(E e);
great_lib.c++
#include "great_lib.h"
void f(E e) { /* do something with e */ }
other_client.h
#include "great_lib_fwd.h"
void other_client(E);
other_client.c++
#include "other_client.h"
#include "great_lib.h"
void other_client(E e) { /* use e */ }
请注意,在other_client.h
等非常有限的环境中,仍然可以避免包含huge_header_with_e.h
。
在实践中,我怀疑你会发现你的客户端代码经常需要指定特定的枚举常量,并且无论如何都需要包含huge_header_with_e.h
,因此相对较少的翻译单元将避免依赖。
答案 3 :(得分:0)
不是真的。在C ++ 11中,您可以在标头中使用不透明的枚举声明,这样您就不必指定枚举常量,但通常enum
足够轻,并且通常不会引入任何额外的依赖关系,因此没有真正的论据反对在任何需要的地方包含它。