得到c常数的值

get the value of a c constant

本文关键字:常数 得到      更新时间:2023-10-16

我有一个.h文件,其中数百个常量被定义为宏:

#define C_CONST_NAME Value

我需要的是一个函数,它可以动态地获取这些常量的值。

所需函数头:

int getConstValue(char * constName);

这在C语言中是可能的吗?

---- EDIT

谢谢你的帮助,这是快速的:)

就像我一直在想的那样,没有什么灵丹妙药能满足我的需求。

实际上我使用的头文件是由"SCADE: http://www.esterel-technologies.com/products/scade-suite/"生成的

我从@Chris那里得到的一个解决方案是使用一些python来生成完成工作的c代码。

现在轮到我做一些优化来找到常量名。我有超过5000个常数O(500^2)

我也在看"X-Macros",我第一次听到这个,它在C中工作,因为我不允许使用c++。

谢谢

C不能为你做这些。您需要将它们存储在不同的结构中,或者使用预处理器来构建所需的数百条if语句。像Cogflect这样的东西可以帮上忙。

给你。您需要为每个新常量添加一行,但它应该让您了解宏的工作原理:

#include <stdio.h>
#define C_TEN 10
#define C_TWENTY 20
#define C_THIRTY 30
#define IFCONST(charstar, define) if(strcmp((charstar), #define) == 0) { 
    return (define); 
}
int getConstValue(const char* constName)
{
    IFCONST(constName, C_TEN);
    IFCONST(constName, C_TWENTY);
    IFCONST(constName, C_THIRTY);
    // No match                                                                                                                                                                                                                              
    return -1;
}
int main(int argc, char **argv)
{
    printf("C_TEN is %dn", getConstValue("C_TEN"));
    return 0;
}

我建议你运行gcc -E filename.c,看看gcc是如何处理这段代码的

C预处理器宏(即由#define语句命名的宏)在预处理完成后停止存在。程序不知道这些宏的名称,也无法返回引用它们。

如果你告诉我们你要做什么任务,我们可能会建议一个替代的方法。

这就是x -宏的用途:

https://secure.wikimedia.org/wikipedia/en/wiki/C_preprocessor X-Macros

但是如果您需要将字符串映射到常量,则必须在字符串表示数组(O(n^2))中搜索字符串。

您可以使用gperf来完成此操作,它生成一个使用完美散列函数的查找函数。

创建一个类似于以下内容的文件,并使用-t选项运行gperf:

struct constant { char *name; int value; };
%%
C_CONST_NAME1, 1
C_CONST_NAME2, 2

gperf将输出C(或c++)代码,该代码在常量时间内进行查找,返回指向键/值对的指针,或NULL。

如果您发现关键字集对于gperf来说太大,请考虑使用cmph。

c中没有这样的功能,但是,您可以使用doxygen等工具将源代码中的所有#define提取到可以在运行时读取的数据结构中(oxygen可以将所有宏定义存储为XML)。