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