是否有人成功地调用了一个函数,用TCC的libtcc返回double?
我在代码中定义了一个返回double的函数,并通过tcc_add_symbol将其添加到libtcc。当我在tcc脚本中调用这个函数并得到返回的值时,这个值是0.000,这与我所期望的不一样。
守则:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "libtcc.h"
double get_double()
{
return 80.333;
}
int get_int()
{
return 333;
}
char my_program[] =
"int foo()\n"
"{\n"
" printf(\"Hello World!\\n\");\n"
" printf(\"double: %.4f\\n\", get_double()); \n"
" printf(\"int: %d\\n\", get_int()); \n"
" return 0;\n"
"}\n";
int main(int argc, char **argv)
{
TCCState *s;
typedef int (*func_type)();
func_type func;
s = tcc_new();
if (!s) {
fprintf(stderr, "Could not create tcc state\n");
exit(1);
}
tcc_set_lib_path(s, "TCC");
tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
if (tcc_compile_string(s, my_program) == -1)
return 1;
tcc_add_symbol(s, "get_double", get_double);
tcc_add_symbol(s, "get_int", get_int);
if (tcc_relocate(s, TCC_RELOCATE_AUTO) < 0)
return 1;
func = (func_type)tcc_get_symbol(s, "foo");
if (!func)
return 1;
func();
tcc_delete(s);
getchar();
return 0;
}运行代码的结果:
Hello World!
double: 0.0000
int: 333为什么get_double()函数返回0.0000,但get_int()成功?
发布于 2013-06-25 01:45:49
看看你的int foo()片段。您必须记住,这个字符串是整个编译单元,就像您将它保存到一个C文件中一样。在这个编译单元中,get_int()和get_double()实际上是未定义的。由于所有未声明的变量和函数都具有int类型,int版本之所以有效是因为运气。这也是为什么get_double不能工作的原因,因为相同的规则假定它在int函数中。
解决办法很简单。只需在脚本中声明函数即可。使用头文件或类似于:
char my_program[] =
"double get_double();\n"
"int get_int();\n"
"int foo()\n"
"{\n"
" printf(\"Hello World!\\n\");\n"
" printf(\"double: %.4f\\n\", get_double()); \n"
" printf(\"int: %d\\n\", get_int()); \n"
" return 0;\n"
"}\n";我强烈建议您使用tcc_set_error_func()来捕获任何警告和错误。
https://stackoverflow.com/questions/17273674
复制相似问题