簡體   English   中英

在 C++ 中的 function 調用中聲明 static 變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM