[英]Declare static variable inside a function call in C++
我有一個 C++ 程序,代碼中有數千個字符串文字需要翻譯,例如:
statusBar->Print( "My Message" );
我用 function 包裝了字符串文字,它在字典中查找值並返回翻譯版本:
statusBar->Print( Translated( "My Message" ) );
問題是,在分析之后,我發現在整個代碼中進行這種查找是一個性能問題。 我想做的是將這樣的行更改為:
static const char * translatedMessage5 = Translated( "My Message" );
statusBar->Print( translatedMessage5 );
但是由於代碼中有數千個這樣的實例,它很容易出錯(並且有點像維護的噩夢)。 我希望我可以將Translated
為一個宏,該宏在行內聲明 static 變量。 這顯然是行不通的。 有人有更好的主意嗎?
您可以更改為唯一的錯誤代碼並將它們索引到向量中嗎? 這簡化了代碼和查找,並且添加額外的錯誤消息變得微不足道。 此外,確保以這種方式添加的錯誤消息更加可見(例如,在此應用程序外部 - 可以輕松發布到“用戶指南”或類似內容)。
#include <string>
#include <vector>
enum ErrorMessages
{
my_message,
my_other_message,
...
msg_high
};
std::vector<std::string> error_messages;
void init()
{
error_messages.resize(msg_high);
error_messages[my_msg] = "My Message";
error_messages[my_other_msg] = "My Other Message";
...
}
const char* const Translate(const ErrorMessage msg)
{
return error_messages[msg].c_str();
}
void f()
{
statusBar->Print(Translated(my_msg));
}
打印消息所需的 I/O 時間應該比任何字典查找時間多幾個數量級。 如果不是這種情況,那么您做錯了什么。
可以使用經過試驗和測試的軟件來滿足您的需求。 我建議你要么學習GNU Gettext ,它被其他所有 FOSS 項目使用,或者只是在你的程序中使用它而不是自制解決方案。
編輯:使用 C++0x 可以做你想做的事,但仍然考慮使用GNU Gettext作為你真正的 l10n 引擎。 這是一些概念驗證的小代碼:
#include <iostream>
const char* realTranslate(const char* txt)
{
std::cout << "*** translated " << txt << std::endl;
return txt; // use a real translation here such as gnu gettext
}
#define Translate(txt) \
(([]()->const char* \
{static const char* out = realTranslate(txt); return out;})())
int main ()
{
for (int i = 0; i < 10; ++i)
{
std::cout << Translate("This is a message") << std::endl;
std::cout << Translate("This is a message") << std::endl;
std::cout << Translate("This is another message") << std::endl;
}
}
我不確定真正的 C++ 標准將指定什么,但在 gcc-4.6 下, realTranslate()
function 被調用了 3 次。
這可能對您沒有幫助,但您可以做的是聲明一個 std::map ,它將包含 hash 的 map -> 文本對。 這里的問題是,如果在字符串上計算 hash 代碼與翻譯它的工作量相同,我不知道。
char * Translate(char *source)
{
static std::map<int, char*> sources;
static std::map<int, char*> results;
int hashcode = CalculateHashCode(source);
std::map<int, char*>::const_iterator it = sources.find( source );
if ( it != sources.end() )
{
return results[ hashcode ];
}
... code to translate ...
results[ hashcode ] = translated;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.