C++ 获取c常量的值

C++ 获取c常量的值,c++,c,C++,C,我有一个.h文件,其中数百个常量被定义为宏: #define C_CONST_NAME Value 我需要的是一个可以动态获取其中一个常量值的函数 所需的函数标题: int getConstValue(char * constName); 这在语言中可能吗 ----编辑 谢谢你的帮助,这很快:) 正如我所想,没有奇迹般的解决办法来满足我的需求 事实上,我使用的头文件是由“SCADE:”生成的 我从@Chris那里得到的一个解决方案是使用一些python来生成完成这项工作的c代码 现在我需要做

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

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

所需的函数标题:

int getConstValue(char * constName);
这在语言中可能吗

----编辑

谢谢你的帮助,这很快:)

正如我所想,没有奇迹般的解决办法来满足我的需求

事实上,我使用的头文件是由“SCADE:”生成的

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

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

我也在看“X宏”,我第一次听到这个词,它在C中工作,因为我不允许使用C++。
谢谢

C不能为你做这件事。您需要将它们存储在不同的结构中,或者使用预处理器来构建所需的数百条if语句。类似的内容可能会有所帮助。

预处理完成后,C预处理器宏(即由
#define
语句命名的宏)将不再存在。程序不知道这些宏的名称,也不知道如何引用它们


如果您告诉我们您要执行的任务,我们可能会建议另一种方法。

这就是X宏的用途:


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

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

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

#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;
}
#包括
#定义C_TEN 10
#定义C_二十20
#定义C_三十30
#如果(strcmp((charstar),#define)=0{\
返回(定义)\
}
int getConstValue(常量字符*常量名称)
{
IFCONST(constName,C_TEN);
IFCONST(constName,C_二十);
IFCONST(constName,C_三十);
//没有对手
返回-1;
}
int main(int argc,字符**argv)
{
printf(“C_TEN是%d\n”,getConstValue(“C_TEN”);
返回0;
}

我建议您运行
gcc-E filename.c
来查看gcc对这段代码做了什么。

您可能可以使用它来执行此操作,它会生成一个使用

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

struct constant { char *name; int value; };
%%
C_CONST_NAME1, 1
C_CONST_NAME2, 2
gperf将输出以恒定时间执行查找的C(或C++)代码,返回指向键/值对的指针或NULL


如果你发现你的关键字集对于GPFF来说太大了,考虑使用它。

常量是预处理器而不是编译器常量,你必须移动到对象空间,例如不确定为什么需要这样做,但是它不可能是动态的。在编译程序源代码之后,上面定义的“常量”实际上并不存在。预处理器用它们的实际值替换它们。不要使用定义的常量。使用一个具有常量值的关联数组。通常,这种方法的实现类似于:,。从何处获取O(n^2)?即使进行线性搜索,也只需要O(n)。使用std::map将其减少为O(logn)。@zennehoy好的,它不是
O(n^2)
,而是
O(n*m)
。比较字符串是
O(n)
而不是
O(1)
。我第一次听说“X-Macros”时,可以使用trie,然后它变成
O(n)
(其中
n
是字符串的长度)。我想
lex
可以生成一个非常高效的查找例程(DFA)。事实上,我使用的头文件是(从SCADE)生成的我还有一个名为constantes的xml版本。因此,我可以使用python生成我的c代码。Thanks@azalsup:不是在python中生成C代码,而是生成yacc语法,运行yacc(或)生成高度优化的C代码以进行匹配。实际上,该工具的
lex
部分可能就是您所需要的全部。