使用原则: 当在C++中引用C的函数或变量,在包含C头文件的时候应该使用extern "C"。

ps: C的函数或变量指的是通过gcc编译的c文件。

1.1 utils.h

#ifndef __utils_h__
#define __utils_h__

void add(int, int);

#endif

1.2 utils.c

#include "utils.h"

void add(int x, int y) {
    int c = x + y;
}

1.3 main.cpp

#include <iostream>

#ifdef __cplusplus
extern "C" {
#endif

#include "utils.h"

#ifdef __cplusplus
}
#endif

int main(int argc, char* argv[]) {
    std::cout << "Hello World!!\n";

    int x = 20;
    int y = 40;

    std::cout << x << " + " << y << " = " << add(x, y) << "\n";
    return 0; 
}
# 标准的编译方式
$ gcc -c -Iinclude src/utils.c          # 通过gcc编译c文件
$ g++ -Iinclude utils.o src/main.cpp    # 通过g++编译c++文件

# 非标准的编译方式
$ g++ -c -Iinclude src/utils.c          # 使用g++编译c文件,会对函数名进行编码
$ g++ -Iinclude utils.o src/main.cpp    # g++编译main.cpp时,由于包含extern "C"会编译
                                        # 不通过,如果想通过g++来编译c文件,extern "C"
                                        # 应该不添加

由于.c文件不支持extern "C",所以第二种用法就是使用.cpp编写c函数或变量

2.1 utils1.h

#ifndef __utils1_h__
#define __utils1_h__

void add1(int, int);

#endif

2.2 utils1.cpp

#ifdef __cplusplus
extern "C" {
#endif

#include "utils1.h"

#ifdef __cplusplus
}
#endif


void add1(int x, int y) {
    int c = x + y;
}

2.3 main1.cpp

#include <iostream>

#ifdef __cplusplus
extern "C" {
#endif

#include "utils1.h"

#ifdef __cplusplus
}
#endif


int main(int argc, char* argv[]) {
    std::cout << "Hello World!!\n";

    int x = 20;
    int y = 40;

    std::cout << x << " + " << y << " = " << add1(x, y) << "\n";
    return 0; 
}
$ g++ -Iinclude src/utils1.cpp src/main1.cpp # 在.cpp中编写c函数或变量时包含头文件时
                                             # 应该使用extern "C",然后统一使用g++
                                             # 进行编译

源码