簡體   English   中英

(如何)可以在C ++中使用字符串數組作為標識符?

[英](How) can I use an array of strings as identifiers in C++?

我正在這個項目上工作,我需要解析一個文本文件,該文件包含一個兩列的表,該表由左側的名稱和右側的值組成。

現在,我需要將它們寫入控制表中的特定位置,這些位置使用十六進制地址進行標識; 在我無法編輯的頭文件中,它們的定義如下:

#define HARRY_POTTER 0x3A

然后有一個寫函數,它接受一個地址和一個值並將其寫到存儲位置(該函數也不受我的控制)。 因此,稱之為

write(0x3A, 7);

將具有與調用此結果相同的結果

write(HARRY_POTTER, 7);

因為在頭文件中有該定義。

現在,我進行了解析,基本上是給我左列,即名稱,它是一個字符串(例如,“ HARRY_POTTER”),而右列,其值是整數。

我想知道的是,是否可以使用任何字符串“ HARRY_POTTER”作為寫入函數中的標識符; 本質上將字符串轉換為標識符,以便我可以遍歷整個解析值數組,它將自動將它們寫入與字符串/左欄中名稱匹配的地址。

這可能嗎? 如果是,怎么辦?

不,您無法要求。 原因是因為從文件讀取的字符串僅在運行時已知,而預處理在編譯時發生,因此必須已替換HARRY_POTTER 實際上,在編譯程序之后根本沒有標識符。

您可能希望它引入從std::string到您定義的常量的映射。 例如:

std::unordered_map<std::string, int> mapping = {{"HARRY_POTTER", HARRY_POTTER},
                                                {"RON_WEASLEY", RON_WEASLEY}};

當然,常量將在編譯時被替換,因此這等效於:

std::unordered_map<std::string, int> mapping = {{"HARRY_POTTER", 0x3A},
                                                {"RON_WEASLEY", 0x7C}};

然后,您可以使用以下命令調用write

write(mapping.at(key), 7);

其中key是一個字符串,其值類似於"HARRY_POTTER"

(此答案在評論中更合適,但我仍在提高聲譽……)

我同意約瑟夫所說的方法是在C ++ 11中是std :: unordered_map或在C ++ 03中是std :: map。

我只想補充一點,在這種情況下,您可以通過一些宏魔術來使代碼更易於維護和編寫。

/* The stringify macro converts x to "x" at compile-time. */
#define _stringify(x) # x
#define stringify(x) _stringify(x)

/* Macro easing the assignment of { "String", value } */
#define STR_VAL(x) { stringify(x), (x) }

/* Now you can write the assignment code as follows */
std::unordered_map<std::string, int> mapping = {
    STR_VAL(HARRY_POTTER),
    STR_VAL(RON_WEASLEY),                                                          
    STR_VAL(ALBUS_BRIAN_WULFRIC_PERCIVAL_DUMBLEDORE)
};

這意味着,如果#define HARRY_POTTER的值發生更改,則重新編譯時,映射代碼將自動更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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