C++用extern"C" 实现加法,结果有误

用用extern"C" 实现跨语言加法时,输出的结果为不确定值,

首先用c写了一个加法函数,放在.c文件中


int sum(int a, int b)
{
    return a + b;
}

.cpp文件:

#include<iostream>
#include<string>
using namespace std;

extern"C" 
{
    int sum(int a, int b);
}

int main() {
    int ret = sum(10, 10);
    cout << "sum="<<sum << endl;
    return 0;
}

结果:
sum=00F01311

extern"C" 需要修饰声明,也需要修饰实现。
文件扩展名是c,生成的obj文件中sum函数不一定满足C调用约定

  • 你可以参考下这篇文章:C++关键字extern的用法:一个文件中的变量或函数在其他文件中调用
  • 除此之外, 这篇博客: C++中的extern “C“的用法中的 1. 在c++中调用c语言封装的方法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • function.c

    int add(int a ,int b)
    {
        return a+b;
    }
    
    

    编译该文件:

    gcc -c function.c
    

    这样就会在目录下生成一个function.o文件
    接着将其打包成静态库文件

    ar -r libfunc.a *.o
    

    到此为止,就编写了一个c语言的静态链接库。

    为了这个库可以被c或者c++进行调用,需要使用extern “C”去编写一个头文件。头文件如下所示:

    function.h

    #ifdef __cplusplus
    extern "C" {
    #endif
    extern int add(int a ,int b);
    #ifdef __cplusplus
    };  /* end of extern "C" */
    #endif
    
    
    #ifndef __cplusplus
    extern int add(int a ,int b);
    #endif
    

    首先是第一部分:

    #ifdef __cplusplus
    extern "C" {
    #endif
    extern int add(int a ,int b);
    #ifdef __cplusplus
    };  /* end of extern "C" */
    #endif
    

    这段的意思是如果是C++语言引入了这个头文件,那么就使用extern "C"去声明该函数。

    接着是第二部分:

    #ifndef __cplusplus
    extern int add(int a ,int b);
    #endif
    

    这段的意思是如果是c语言引入了这个头文件,就直接使用extern进行声明。

    接下来在c语言中调用这个库中的函数。

    main.c

    #include "stdio.h"
    #include "function.h"
    
    int main()
    {
        int i = add(2,3);
        printf("2+3=%d\n",i);
    
        return 0;
    }
    

    接下来在c++程序中调用这个库中的函数。

    main.cpp

    #include <iostream>
    using namespace std;
    #include "function.h"
    
    int main()
    {
        int i =  add(2,3);
        cout<<"2+3="<<i<<endl;
    
        return 0;
    }
    
    


int main() {
    int ret = sum(10, 10);
    cout << "sum="<<ret<< endl;//这里注意
    return 0;
}