2013-06-24 3 views
1

누구나 TCC의 libtcc를 사용하여 double을 반환하는 함수를 성공적으로 호출 했습니까?TCC가 이중을 반환하는 함수를 호출합니다.

내 코드에 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()이 성공 하는가?

답변

1

int foo() 스 니펫을 살펴보십시오. 이 문자열은 마치 C 파일에 저장 한 것처럼 전체 컴파일 단위입니다. 이 컴파일 단위 내에서 get_int() 및 get_double()은 실제로 정의되지 않습니다. 모든 선언되지 않은 변수와 함수는 int 유형이므로 int 버전은 운에 따라 작동합니다. 그리고 이것이 get_double이 작동하지 않는 이유이기도합니다. 왜냐하면 같은 규칙이 int 함수로 간주하기 때문입니다.

솔루션은 간단합니다. 스크립트에서 함수를 선언하십시오. 헤더 파일 또는 다음과 같은 것을 사용하십시오 :

tcc_set_error_func()를 사용하여 경고 및 오류를 캡처하는 것이 좋습니다.

+0

대단히 감사합니다. TCC 예제가 함수를 선언하지 않았기 때문입니다. – user1531899

+0

당신은 오신 것을 환영합니다. 답이 문제를 해결하면 답을 좋아하거나 받아 들일 것을 정중히 묻기를 바랍니다. – mikijov