得到c常数的值
get the value of a c constant
我有一个.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)。
- 使用C++程序合并排序没有得到正确的输出
- 为什么在这个代码结束循环中没有得到结束
- 序列化,没有库的整数,得到奇怪的结果
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 计算缩放多边形的比例,得到给定的多边形面积
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 为什么我在使用void函数时得到错误代码C2276
- 如何在cuSparse中得到稀疏矩阵的对角线
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 方法内部但循环仍得到预期的不合格id错误C++
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 为什么我在输出端得到 nan?
- 我写了一个C++程序来模拟Enigma机器.我没有得到输出
- 使用 bfs 解决连接组件问题时得到错误的答案
- 修改的Fibbonaci C++得到一个大的负数
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- 为什么这个递归没有得到它的基本情况?
- 我正在尝试按降序对地图进行排序,但没有得到预期的结果?
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 得到c常数的值