【发布时间】:2015-04-26 20:17:31
【问题描述】:
我一直在尝试找到一种在运行时使用宏定义字符串作为其值的方法。我的测试场景是这样的
在用户定义的文件'data.txt'中
Reg1 0x12345678
在 test.c 中
extern write(uint64_t addr, uint32_t value);
main(){
FILE * reg_data;
char reg_name[256];
uint32_t value;
reg_data = fopen("data.txt", "r");
if(reg_data == NULL){
print_log("Cannot open file data.txt\n");
exit(-1);
}
while(fscanf(reg_data, "%s %x \n", reg_name, value) != EOF){
write((uint64_t)reg_name, value);
}
}
在另一个包含的文件'head.h'中
#define reg1 0x400000000
所以我希望我的 write 调用转换为 write(0x400000000, 0x12345678)
然而,由于这些#define 在编译时被替换,它没有生效。另外,由于我对字符串进行了类型转换,因此它通过了编译和详细说明,替换了字符串的 int 等效项。
有没有办法做到这一点?主要要求是用户生成的文件定义了宏字符串而不是实际的地址值。
【问题讨论】:
-
你的
main()签名错误,可以是int main(),但不只是main()没有任何返回类型。 -
我对字符串进行了类型转换,它通过了编译和细化,替换了字符串的 int 等效项 什么?
-
使用
strtol()并将基址16传递给它。而且,write()是一个标准函数,它需要 2 个int's -
我猜不出你真正需要什么,因为你要求的是时间旅行。无论你从文件中得到什么,都是在运行时,在像#define 这样的编译时东西消失很久之后。你真正想做的是什么?以某种方式处理文件,以某种形式产生输出?请尽量具体,尽量不要谈论语言或细节——只是你想做的。
-
Reg1不等于reg1。
标签: c macros runtime c-preprocessor