我想知道是否有辦法我可以寫一個函數原型的.h文件,並在實現中改變簽名,所以它會與原型略有不同。C++原型不同然後實現
我想這樣做的原因是因爲有一些#include的枚舉類型,我不想在.h文件中做,但只在.c文件中,並且枚舉是函數的簽名,所以我想知道如果我可以寫枚舉作爲INT(枚舉和int基本上是相同的..)或原型中的東西,但然後我得到一個編譯錯誤。 有沒有一個很好的方式,我可以做它?
在此先感謝..
我想知道是否有辦法我可以寫一個函數原型的.h文件,並在實現中改變簽名,所以它會與原型略有不同。C++原型不同然後實現
我想這樣做的原因是因爲有一些#include的枚舉類型,我不想在.h文件中做,但只在.c文件中,並且枚舉是函數的簽名,所以我想知道如果我可以寫枚舉作爲INT(枚舉和int基本上是相同的..)或原型中的東西,但然後我得到一個編譯錯誤。 有沒有一個很好的方式,我可以做它?
在此先感謝..
如果我理解正確的話,你總是可以做一個包裝函數,例如。
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
如果有人想知道性能影響,任何體面的編譯器都會使用-O2優化它。實際上,使用static關鍵字會更好,並且還有助於編譯器優化:-) – benjarobin
'ActuallyDoSomething'應該標記爲'static'。 – Pubby
是的,我想過,但我忘了提及,我仍然想用枚舉類型而不是INT來調用這個函數.. – gal
如果是C++,你可以使用函數重載,我猜。
file.h
void DoSomething(int i);
file.cpp
void DoSomething(MyEnum myEnum)
{
// Do something
}
void DoSomething(int i)
{
DoSomething((MyEnum)i);
}
我沒有使用C++一會兒。所以,不是100%確定這是否會按預期工作。
我將概述如何創建前向聲明標題。這種技術可能從<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
,所以相對較少的翻譯單元將避免依賴。
是的,使用私有常量#defines而不是枚舉。 – cdleonard
你是什麼意思? – gal