Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以从C中的文件中读取常量吗?_C_File - Fatal编程技术网

可以从C中的文件中读取常量吗?

可以从C中的文件中读取常量吗?,c,file,C,File,我有一个名为definitions.h的文件,如下所示: #define PACKAGE 270 #define IMPORT 271 #define COMILLAS 272 #define FUNCION 273 ... 我有一个文本文件,其中包含以下信息: PACKAGE package IMPORT import COMILLAS " FUNCION func 是否可以以允许我在两个数组中加载常量本身和小写单词的方式读取第二个文件?在一个数组中,它是PACKAGE,IMPORT,其定

我有一个名为definitions.h的文件,如下所示:

#define PACKAGE 270
#define IMPORT 271
#define COMILLAS 272
#define FUNCION 273
...
我有一个文本文件,其中包含以下信息:

PACKAGE package
IMPORT import
COMILLAS "
FUNCION func
是否可以以允许我在两个数组中加载常量本身和小写单词的方式读取第二个文件?在一个数组中,它是PACKAGE,IMPORT,其定义的值与之关联,在第二个数组中,它是小写单词(PACKAGE,IMPORT,”,func)

我试着把大写字母读成字符串,但我不知道如何把它们变成常量


提前感谢。

为了做到这一点,您的程序必须为每个要翻译的名称包含一个字符串值。不仅仅是宏,宏在编译早期会转换为它们的值,而不会留下您在其中使用的名称的任何痕迹

所以您需要一个文件,比如definitions.c,包含如下内容:

struct TokenNameEntry {
    int value;
    const char* name;
};

const struct TokenNameEntry tokens[] = {
    { PACKAGE, "PACKAGE" },
    { IMPORT, "IMPORT" },
    { COMILLAS, "COMILLAS" },
    { FUNCION, "FUNCION" },
    // ...
};
#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.h和definitions.c

为了更好地实现这一点,我喜欢使用“宏文件”。它只包含一个或多个宏的重复使用,以便其他文件可以定义宏,并使该文件说明其包含的数据的各种内容。我们将此文件称为“定义”\u 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将更改为类似于:

struct TokenNameEntry {
    int value;
    const char* name;
};

const struct TokenNameEntry tokens[] = {
    { PACKAGE, "PACKAGE" },
    { IMPORT, "IMPORT" },
    { COMILLAS, "COMILLAS" },
    { FUNCION, "FUNCION" },
    // ...
};
#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
和定义。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
宏添加更多参数。

问题尚不清楚。能否详细说明?是否要读取这两个文件以创建包含其内容的数组?这只需要从文件中读取并分配参数即可数组的元素。是否希望在编译时发生这种情况?我需要的是只读取第二个文件。问题是我希望大写单词(PACKAGE,IMPORT..)是第一个文件中定义的常量,而不是字符串。例如,我希望存储PACKAGE(与270关联的定义值),而不是“PACKAGE”(文件中的字符串)。@J…S