C++中extern “C”含义深层探索(在原作的基础上修改)
1.
引言
C++
语言的创建初衷是“a
better C”
,但是这并不意味着C++
中类似C
语言的全局变量和函数所采用的编译和连接方式与C
语言完全相同。作为一种欲与C
兼容的语言,C++
保留了一部分过程 式语言的特点(被世人称为“
不彻底地面向对象”
),因而它可以定义不属于任何类的全局变量和函数。但是,C++
毕竟是一种面向对象的程序设计语言,为了支
持函数的重载,C++
对全局函数的处理方式与C
有明显的不同。
2.
从标准头文件说起
某企业曾经给出如下的一道面试题:
面试题
为什么标准头文件都有类似以下的结构?
#ifndef
__INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}
#endif
#endif /* __INCvxWorksh */
分析
显然,头文件中的编译宏“#ifndef __INCvxWorksh
、#define __INCvxWorksh
、#endif”
的作用是防止该头文件被重复引用。
那么
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
的作用又是什么呢?我们将在下文一一道来。
3.
深层揭密extern
"C"
extern "C"
包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”
的;其次,被它修饰的目标是“C”
的。让我们来详细解读这两重含义。
被extern "C"
限定的函数或变量是extern
类型的;
extern
是C/C++
语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。记住,下列语句:
extern int a;
仅仅是一个变量的声明,其并不是在定义变量a
,并未为a
分配内存空间。变量a
在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。
考虑下面的情况:
有两个头文件a.h main.cpp
一:
list: a.h
int
a
= 10;
list: main.cpp
#include
<vector>
#include
<iostream>
using
namespace
std
;
int
main
()
{
std
::cout
<< a
;
}
很显然,在编译main.cp
相关文档:
Boss说,要看OpenGL,看了快一个月,总算出了个像样的东西,用C写了个3D迷宫,
虽然只有350行
代码,不过边学边写,足足写了一周时间,还是小有成就感的,活活活!
&n ......
/*
* 2010-1-21
* 该文件时内核中有关任务调度的函数程序,其中包含基本函数sleep_on,
* wakeup,schedule等,以及一些简单的系统调用。同时将软盘的几个操作
* 函数也放置在这里。
*
* schedule函数首先对所有的任务检查,唤醒任何一个已经得到信号的任务,
* ......
采用注入到其他进程的方法来隐藏自己的进程。就是说,把你想做的事情寄生到别人的进程里面。比如IE什么的。关于注入的方法很多,下面我给你一个DLL注入的方法,这个是我做某外挂时用过的代码,你参考一下把。
int APIENTRY _tWinMain( HINSTANCE hInstance,
  ......
NAME
perlembed - 在 C 程序中嵌入 perl
DESCRIPTION
导言
你是想要:
在 Perl 中使用 C?
阅读 perlxstut、perlxs、h2xs、perlguts 和 perlapi。
在 Perl 中使用 Unix 程序?
& ......