2017-10-15 56 views
-1

我有一个名为definitions.h像这样的文件:是否有可能从C中的文件读取常量?

#define PACKAGE 270 
#define IMPORT 271 
#define COMILLAS 272 
#define FUNCION 273 
... 

我还有下一个信息的文本文件:

PACKAGE package 
IMPORT import 
COMILLAS " 
FUNCION func 

是否可以读取的方式第二个文件允许我在两个数组中加载常量本身和小写字母?在一个数组中,它将是PACKAGE,IMPORT与其定义的值关联,并在第二个小写字(包,导入,“,func)

我尝试读取大写字母作为字符串,但我不知道如何其更改为一个常数。

预先感谢您。

+0

这个问题还不清楚。你能详细说明吗?你是否想从2个文件中读取数据以创建其内容?这只会涉及从文件中读取数据并将其分配给数组。 –

+1

你想在编译时发生这种情况吗? – Gnqz

+0

我需要的是只读取第二个文件。问题是我想要大写字(PACKAGE,IMPORT ..)是第一个文件中定义的常量,而不是字符串。例如,我想存储PACKAGE(与270相关的定义值)而不是“PACKAGE”(文件中的字符串)。 @J内容S – Daniel

回答

1

为了做到这一点,你的程序必须包含要转换的每个名称的字符串值。不只是宏,被转换到它们的值在编译的早期,不留下你在那里使用的名字的痕迹。

所以你需要一个文件,说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宏。

相关问题