爲了做到這一點,你的程序必須包含要轉換的每個名稱的字符串值。不只是宏,被轉換到它們的值在編譯的早期,不留下你在那裏使用的名字的痕跡。
所以你需要一個文件,說defin itions.c,其中包含如下內容:
struct TokenNameEntry {
int value;
const char* name;
};
const struct TokenNameEntry tokens[] = {
{ PACKAGE, "PACKAGE" },
{ IMPORT, "IMPORT" },
{ COMILLAS, "COMILLAS" },
{ FUNCION, "FUNCION" },
// ...
};
但是如何不重複自己?現在,如果添加或刪除任何常量,則需要更新definitions.h和definitions.c。
爲了使這個更好,我喜歡使用「宏文件」。這包含重複使用一個或多個宏,以便其他文件可以定義宏並使該文件對其所包含的數據進行各種說明。讓我們把這個文件definitions_macros.h:
/* definitions_macros.h
* NO INCLUDE GUARD: A file may redefine the macros and include
* more than once. */
DEFINE_TOKEN(PACKAGE, 270)
DEFINE_TOKEN(IMPORT, 271)
DEFINE_TOKEN(COMILLAS, 272)
DEFINE_TOKEN(FUNCION, 273)
// ...
然後definitions.h會改變看起來是這樣的:
#ifndef CONST_DEFINITIONS_H_
#define CONST_DEFINITIONS_H_
#define DEFINE_TOKEN(symbol, value) symbol = value,
typedef enum {
#include "definitions_macros.h"
} TokenType;
#undef DEFINE_TOKEN
const char* token_to_name(TokenType tok);
TokenType token_from_name(const char* name);
#endif
而且definitions.c變爲:
#include "definitions.h"
struct TokenNameEntry {
TokenType value;
const char* name;
};
#define STRINGIFY_NOEXPAND(x) #x
#define STRINGIFY(x) STRINGIFY_NOEXPAND(x)
#define DEFINE_TOKEN(symbol, value) { symbol, STRINGIFY(symbol) },
const struct TokenNameEntry tokens[] = {
#include "definitions_macros.h"
};
#undef DEFINE_TOKEN
const unsigned int num_tokens = sizeof(tokens)/sizeof(tokens[0]);
const char* token_to_name(TokenType tok) {
// TODO!
}
TokenType token_from_name(const char* name) {
// TODO!
}
現在你有一種將您從文件中的一行讀取的字符串獲取到要存儲以表示它的數值的方法。您可以輕鬆地在一個地方輕鬆更改這些常量標記的列表或值。如果有其他事情需要用所有這些值進行強烈模式化(可能是switch語句?),則可以重用相同的宏文件。如果您想要將更多的數據與這些常量關聯起來,則可以將更多參數添加到DEFINE_TOKEN
宏。
這個問題還不清楚。你能詳細說明嗎?你是否想從2個文件中讀取數據以創建其內容?這隻會涉及從文件中讀取數據並將其分配給數組。 –
你想在編譯時發生這種情況嗎? – Gnqz
我需要的是隻讀取第二個文件。問題是我想要大寫字(PACKAGE,IMPORT ..)是第一個文件中定義的常量,而不是字符串。例如,我想存儲PACKAGE(與270相關的定義值)而不是「PACKAGE」(文件中的字符串)。 @J內容S – Daniel