extern C - ShenYj/ShenYj.github.io GitHub Wiki

extern C

extern "C"修饰的代码会按照C语言的方式去编译

  • 示例代码

    extern "C" void func() {
    
    }

    或者用大括号包裹的方式

    extern "C" {
        void func() {
    
        }
        void funa(int v) {
    
        }
    }
    
    extern "C" {
        void func();
        void funa(int v);
    }
    
    extern "C" {
        #include "math.h"
    }
    

如果函数同时有声明和实现, 要让函数声明被 extern "C"修饰, 函数实现可以不修饰

  • 示例代码

    extern "C" void func();
    void func() {
    
    }

    两个地方都加 extern "C" 也是可以的

由于 C 、C++ 编译规则的不同,在 C 、C++ 混合开发时, 可能会经常出现以下操作

  1. 在 C++ 代码中引用 C 语言函数, 默认会按照 C++ (name mangling)编译后函数名的规则去查找,找不到 C 中提供的函数,需要告诉编译器按照 C 语言的方式去编译查找函数

  2. 更严谨和方便的方式是在编写C语言函数时,直接将函数声明增加 extern "C"修饰, 这样混合开发时,别人在使用的时候不需要额外修饰处理, 通过宏定义区分环境

    #ifdef __cplusplus
    extern "C" {
    #endif // __cplusplus
    
    int sum(int v1, int v2);
    int delta(int v1, int v2);
    int divide(int v1, int v2);
    
    #ifdef __cplusplus
    }
    #endif // __cplusplus
  3. 防止重复包含 include, 为了防止重复包含, 通过 ifndef 来进行判断

    #ifndef __MATH_H
    #define __MATH_H
    
    #ifdef __cplusplus
    extern "C" {
    #endif // __cplusplus
    
    int sum(int v1, int v2);
    int delta(int v1, int v2);
    int divide(int v1, int v2);
    
    #ifdef __cplusplus
    }
    #endif // __cplusplus
    
    
    #endif // !__MATH_H

    保证每个头文件中的宏唯一, 通常使用文件名来定义宏, 并以两个下划线开头,区别于普通的宏

⚠️ **GitHub.com Fallback** ⚠️