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