C++中的关键字

extern "C"

extern "C" 主要是为了解决C++和C混编出现的问题,被extern "C" 修饰的代码会按照C语言的方式去编译

example

在C语言中是不支持函数重载的,这2个函数都加了extern "C" ,使用C语言的方式编译,就回报错

extern "C" void func() {
    cout << "func" << endl;
}

extern "C" void func(int a) {
    cout << "func" << endl;
}

//上面的写法等同于下面:

extern "C" {
    void func() {
        cout << "func" << endl;
    }

    void func(int a) {
        cout << "func" << endl;
    }
}

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

extern "C" void func();
extern "C" void func(int a);

//使用上面或者下面都可以

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

void func() {
    cout << "func" << endl;
}

void func(int a) {
    cout << "func" << endl;
}

C++和C语言混编问题

由于C和C++的编译规则不同,在使用C、C++混合开发的时候,在C++调用C语言的API的时候,需要使用extern "C" 修饰C语言的函数声明

#ifdef __cplusplus
extern "C" {
#endif

//这里把C语言的函数包起来
int func();

#ifdef __cplusplus
}
#endif

#pragma once

我们经常使用 #ifndef、#define、#endif 来防止头文件被包含

#ifndef __MATH_H //通常使用__开头,文件名字作为宏的名字,防止宏文件名字重复
#define __MATH_H

#endif

#pragma once 的作用是防止整个文件被重复包含,与上面的方法相比有如下区别

1.#ifndef、#define、#endif 受C\C++的标准支持,不收编译器的任何限制
2.有些老的编译器不支持#pragma once(GCC3.4之前不支持),兼容性没上面的好
3.#ifndef、#define、#endif 可以针对文件的一部分内容,而#pragma once 在只能针对整个文件

posted @ 2021-08-05 15:06  弄啥来  阅读(101)  评论(0)    收藏  举报