首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCC调用一个返回双重值的函数

TCC调用一个返回双重值的函数
EN

Stack Overflow用户
提问于 2013-06-24 10:50:46
回答 1查看 492关注 0票数 1

是否有人成功地调用了一个函数,用TCC的libtcc返回double

我在代码中定义了一个返回double的函数,并通过tcc_add_symbol将其添加到libtcc。当我在tcc脚本中调用这个函数并得到返回的值时,这个值是0.000,这与我所期望的不一样。

守则:

代码语言:javascript
复制
#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;
}

运行代码的结果:

代码语言:javascript
复制
Hello World!

double: 0.0000

int: 333

为什么get_double()函数返回0.0000,但get_int()成功?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-25 01:45:49

看看你的int foo()片段。您必须记住,这个字符串是整个编译单元,就像您将它保存到一个C文件中一样。在这个编译单元中,get_int()和get_double()实际上是未定义的。由于所有未声明的变量和函数都具有int类型,int版本之所以有效是因为运气。这也是为什么get_double不能工作的原因,因为相同的规则假定它在int函数中。

解决办法很简单。只需在脚本中声明函数即可。使用头文件或类似于:

代码语言:javascript
复制
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()来捕获任何警告和错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17273674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档