linux 64位系统,C语言调用外部函数,返回值不对的问题

centos 64位操作系统,C 开发的程序调用一个外部函数(在另外一个 C 文件中定义),因为没有添加该外部函数的声明,导致函数返回的值不正确。示例如下:

两个源文件,main.c 和 func.c,内容如下:

main.c:

#include <stdio.h>
int main(int argc, char *argv[])
{
        printf("main:%ld\n",func());
        return 0;
}

func.c:

#include <stdio.h>
unsigned long long func()
{
        unsigned long long a = 1;
        unsigned long long x = (a << 32) | 123456;
        printf("func:%ld\n", x);
        return x;
}

编译执行,结果如下:

gcc main.c func.c
./a.out

func:4295090752
main:123456

以上可以看到,func 函数里的值与 main 函数获取到的返回值不一致,返回值被截断了,只保留了低 32 位。

解决方法:

在 main.c 文件中添加 func 函数的声明,如下:

#include <stdio.h>
extern unsigned long long func();
int main(int argc, char *argv[])
{
        printf("main:%ld\n",func());
        return 0;
}

再次执行,结果就正常了,如下:

gcc main.c func.c
./a.out

func:4295090752
main:4295090752

文章评论

0条评论