我试图在C中找到结构的变量名。例如:
def.h
typedef struct
{
int fov_one;
int fov_two;
int timing_chain;
...
...
float ratio;
float spare_floats[15];
}PARAMETERS;
该结构最多可容纳200个参数,但目前只有部分参数正在使用中。目前,结构PARAMETERS中的值由二进制文件填充。但是,某些用户希望在填充后在运行时更改一个或两个值。我想创建一个基于变量名的字符串版本更改值的选项。比如,如果我想改变变量比,我希望用户能够输入一个字符串"比率.25"并替换" ratio"的当前值用" .25"。
根据我的阅读,由于没有反射,因此无法在C中根据变量名的字符串版本找到变量。目前,我的想法是解析头部以获取变量名称,但是有人提到它可能在链接之前从链接器获取名称。根据我的理解,编译器/链接器在编译期间删除变量名称并使用地址来访问变量,而不是符号。
我想知道是否可以打印出包含编译器/链接器创建的变量名和偏移量的符号映射。
使用gcc选项
gcc -o foo foo.c -Wl,Map,foo.map
创建一个地图,但不包含结构的变量名称。
是否可以在编译时提取由编译器/链接器创建的变量偏移映射?
答案 0 :(得分:0)
由于您控制源代码,常用的技术是生成"名称以抵消"在编译时映射。
例如:
// parameter_fields.inc -- describes fields in struct PARAMETERS
xxx(int, fov_one)
xxx(int, fov_two)
...
xxx(float, ratio)
// def.h
struct _PARAMETERS {
#define xxx(a, b) a b;
#include "parameter_fields.inc"
#undef xxx
} PARAMETERS;
// in somefile.c
#include <stddef.h>
#include "def.h"
struct {
const char *name;
int offset;
} PARAMETER_OFFSETS[] = {
#define xxx(a, b) #b, __offsetof__(struct _PARAMETERS, b),
#include "parameter_fields.inc"
#undef xxx
};
现在,您可以将代码作为PARAMETER_OFFSETS
数组的一部分随时用于代码。