C++ EXTERN 关键词

黎 浩然/ 16 5 月, 2022/ C/C++, 计算机/COMPUTER/ 0 comments

C++虽然兼容C,但C++文件中函数编译后生成的符号与C语言生成的不同。因为C++支持函数重载,C++函数编译后生成的符号带有函数参数类型的信息,而C则没有。

例如int add(int a, int b)函数经过C++编译器生成.o文件后,add会变成形如 _Z3addii之类的, 而C的话则会是形如add, 就是说:相同的函数,在C和C++中,编译后生成 的符号不同。

这就导致一个问题:如果C++中使用C语言实现的函数,在编译链接的时候,会出错,提示找 不到对应的符号

C++ Call C

//add.h
#ifndef ADD_H
#define ADD_H
int add(int x,int y);
#endif
//add.c
#include "add.h"
int add(int x,int y) {
    return x+y;
}

将上面的文件以C语言编译成对象文件后 gcc -c add.c -o add.o

以下调用会报链接错误 g++ add.cpp add.o -o main

//add.cpp
#include <iostream>
#include "add.h"
using namespace std;
int main() {
    add(2,3);
    return 0; 
}

正确的调用方式如下

//add.cpp
#include <iostream>
using namespace std;
extern "C" {
    #include "add.h"
}
int main() {
    add(2,3);
    return 0; 
}

C Call C++

这不是默认允许的行为,除非能对C++的代码作修

// add.h
#ifndef ADD_H
#define ADD_H
extern "C" {
    int add(int x,int y);
}
#endif
// add.cpp
#include "add.h"
int add(int x,int y) {
    return x+y;
}

// add.c
extern int add(int x,int y);
int main() {
    add(2,3);
    return 0; 
}

将以上文件编译成C++库后,add才能被C语言调用 g++ -c add.c -o add.o

// add.c
extern int add(int x,int y);

int main() {
    add(2,3);
    return 0; 
}

gcc add.c add.o -o main

Share this Post

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注

*
*