得到一个c常量的值

时间:2011-07-18 15:32:33

标签: c++ c

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

#define C_CONST_NAME Value

我需要的是一个可以动态获取其中一个常量值的函数。

需要的函数头:

int getConstValue(char * constName);

这在C语言中是否可行?

----编辑

感谢您的帮助,那很快:)

因为我认为没有奇迹解决方案满足我的需求。

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

生成的

我从@Chris获得的解决方案是使用一些python来生成可以完成工作的c代码。

现在让我进行一些优化以找到常量名称。我有超过5000个常数O(500 ^ 2)

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

谢谢

6 个答案:

答案 0 :(得分:6)

C不能为你做这件事。您需要将它们存储在不同的结构中,或使用预处理器来构建您需要的数百个if语句。像Cogflect这样的东西可以提供帮助。

答案 1 :(得分:4)

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

#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 %d\n", getConstValue("C_TEN"));

    return 0;
}

我建议您运行gcc -E filename.c以查看gcc对此代码的处理方式。

答案 2 :(得分:3)

预处理完成后,C预处理器宏(即由#define语句命名的内容)不再存在。程序不知道这些宏的名称,也没有任何方式可以参考它们。

如果您告诉我们您要执行的任务,我们可能会建议您采用其他方法。

答案 3 :(得分:1)

这就是X-Macros用于:

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

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

答案 4 :(得分:1)

C中没有内置此功能。但是,您可以使用doxygen之类的工具将源代码中的所有#define提取到可在运行时读取的数据结构中(doxygen)可以将所有宏定义存储到XML中。

答案 5 :(得分:1)

您可以使用gperf执行此操作,生成使用perfect hash function的查找功能。

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

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

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

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