C++ Primer 5th笔记(chap 19 特殊工具与技术)链接指示: extern “C“

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 19 特殊工具与技术)链接指示: extern “C“相关的知识,希望对你有一定的参考价值。

1. C++程序有时需要调用其他语言编写的函数, C++使用链接指示( linkage directive)指出任意非 C++函数所用的语言

1.1 声明一个非C++函数

// 可能出现在 C++头文件<cstring>中的链接指示
// 单语句链接指示
extern "C" size_t strlen(const char *);

// 复合语句链接指示
extern "C" {
    int strcmp(const char*, const char*);
    char *strcat(char*, const char*);
} 

1.2 链接指示与头文件

// 复合语句链接指示
extern "C" {
     #include <string.h>  // 操作C风格字符串的C函数
}

1.3 指向 extern "C”函数的指针

// pf指向一个C函数, 该函数接受一个int返回void
extern "C" void (*pf)(int);
  • 指向 C 函数的指针与指向 C++函数的指针是不一样的类型。 一个指向 C 函数的指针不能用在执行初始化或赋值操作后指向 C++函数, 反之亦然。 就像其他类型不匹配的问题一样, 如果我们试图在两个链接指示不同的指针之间进行赋值操作, 则程序将发生错误:
void (*pf1) (int );/ / 指向一个 C++函数
extern "C" void (*pf2) (int );/ / 指向一个 c 函数
pfl = pf2;/ / 错误: pfl 和 pf 2 的类型不同

1.4 链接指示对整个声明都有效

当我们使用链接指示时, 它不仅对函数有效, 而且对作为返回类型或形参类型的函数指针也有效:

//fl 是一个 C 函数, 它的形参是一个指向 C 函数的指针
extern "C" void fl(void(* ) (int ) );

如果希望给 C++函数传入一个指向 C 函数的指针, 则必须使用类型別名
// FC 是一个指向 C 函教的指针
extern "C" typedef void FC (int);

// f 2 是一个 C++函数, 该函数的形参是指向 C 函数的指针
void f2 (FC *);

1.5 导出 C++函数到其他语言

//calc 函数可以被 C 程序调用
extern "C" double calc (double dparm) { / ... */ }

1.5.1 对链接到 C 的预处理器的支持

有时需要在 C 和 C++中编译同一个源文件, 为了实现这一目的, 在编译 C++版本的程序时预处理器定义_ _cplusplus ( 两个下画线 )。

#ifdef _ _cplusplus
// 正确: 我们正在编译 C++程序
extern "C"
#endif
int strcmp (const char*, const char* );

1.6 重载函数与链接指示

  • C语言不支持函数重载
// 错误: 两个extern "C"函数的名字相同
extern "C" void print(const char*);
extern "C" void print(int)
  • c++支持
class Smalllnt{/ * ... * /};  
class BigNum{/ ... */};

//C函数可以在C或C++程序中调用
//C++函数重栽了该函数, 可以在C++程序中调用
extern "C" double calc(double);
extern Smalllnt calc(const Smalllnts);
extern BigNum calc const BigNum&);

以上是关于C++ Primer 5th笔记(chap 19 特殊工具与技术)链接指示: extern “C“的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer 5th笔记(chap 19 特殊工具与技术)malloc 函数与 free 函数

C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配

C++ Primer 5th笔记(chap 19 特殊工具与技术)使用 RTTI

C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid

C++ Primer 5th笔记(chap 19 特殊工具与技术)定位 new 表达式

C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针