• 被extern "C" 修饰后按照C语言编译


    录屏软件 FSCapture

    extern "C" c语言编译 会发现报错,C语言不支持函数重载

    #include <iostream>
    using namespace std;
    
    extern "C" void func() {
    
    }
    
    extern "C" void func(int v) {
    	
    }
    
    int main() {
    
    	getchar();
    	return 0;
    }
    

    还可以extern "C" {}全部包含修饰;只声明函数声明的地方也可以

    使用语言都会使用到第三方框架/库

    可能是用C语言写的开源库

    • C++想调用开源C语言的库 使用extern "C" {}
      math.c
    int sum(int v1, int v2){
        return v1 + v2;
    }
    
    int delta(int v1, int v2) {
        return v1 - v2;
    }
    

    将函数的实现放到源文件C,将函数的声明放到头文件,方便大量文件使用

    C++使用库文件时直接包含

    #include <iostream>
    using namespace std;
    
    extern "C" {
        #include "math.h"
    }
    
    int main() {
    
    	cout << sum(10, 20) << endl;
    	cout << delta(10, 20) << endl;
    
    	getchar();
    	return 0;
    }
    

    直接将extern "C"放头文件中,但是要考虑C语言的库在C语言中也会调用的问题

    #include <iostream>
    using namespace std;
    
    #include "math.h"
    
    
    int main() {
    
    	cout << sum(10, 20) << endl;
    	cout << delta(10, 20) << endl;
    
    	getchar();
    	return 0;
    }
    

    C和C++同时调用C语言库,不是C++环境extern "C"将不起作用

    这需要宏定义 
    编译器在C++环境里面预先定义了一个宏,只要是C++文件就有一个隐形的宏存在
    #define __cplusplus    定义在最前面,隐形的代码,如下所示
    
    #define __cplusplus    //c++文件默认加的,看不见,不需要额外写
    #include <iostream>
    using namespace std;
    

    用这个#define __cplusplus宏的差异来区分是不是C++环境

    头文件的math.h定义

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    	int sum(int v1, int v2);
    	int delta(int v1, int v2);
    
    #ifdef __cplusplus
    }
    #endif
    

    防止重复包含,包起来判断

    #ifndef ABC     //判断宏ABC有没有定义
    #define ABC     
    #endif
    
    • 最终头文件如下,判断是否重复定义宏
      特殊的宏用__表示切大写
    #ifndef __MATH.H     //没有就定义,保证宏与文件一一对应
    #define __MATH.H
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    	int sum(int v1, int v2);
    	int delta(int v1, int v2);
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    

    pragma once防止整个文件的内容被重复包含,较老编译器不支持,如GCC3.4版本之前

    #pragma once  //放最前面就可以,保证后面的内容不一样
    ...
    
  • 相关阅读:
    Vue根据URL传参来控制全局 console.log 的开关
    原来你是这样的毛玻璃
    CSS3边框会动的信封
    判断当前系统当前浏览器是否安装启用 Adobe Flash Player,检查在chrome中的状态
    随笔一个正则
    PHP实现栈数据结构
    php实现一个单链表
    php中按值传递和按引用传递的一个问题
    利用shell脚本或者php移动某个文件夹下的文件到各自的日期组成的目录下
    php中DateTime、diff
  • 原文地址:https://www.cnblogs.com/sec875/p/12253083.html
Copyright © 2020-2023  润新知