易截截图软件、单文件、免安装、纯绿色、仅160KB

extern C 的作用

extern "C" 是 C++ 编译器支持的一种链接指示符(linkage directive),它表示由其声明的函数使用 C 语言的方式编译和链接。
C 和 C++ 对函数编译后产生的符号名是不一样的。假设一个函数的原型为:
void foo(int x, int y);
由 C 编译器编译后产生的符号名为 _foo,而 C++ 由于支持重载的需要,编译后的符号名为 _foo_int_int 。当该函数由 extern "C" 修饰后,C++ 编译器会按 C 的规则把它编译成 _foo。
extern "C" 的用法有两种格式:
单一语句形式的链接指示符:
extern "C" void foo(int, int);
复合语句形式的链接指示符:
extern "C" {
void foo(int, int);
void bar(int, int);
}
extern "C" 典型的用法是类似下面的格式包含在一个头文件中:
#ifdef __cplusplus
extern “C” {
#endif
void fun(void);
… …
#ifdef __cplusplus
}
#endif
这样声明的头文件有以下特点:
1. 能同时支持 C 或 C++ 编译器。(C 编译器不支持 extern "C" 符号,所以由 __cplusplus 宏保护)
2. 头文件中声明的函数都按照 C 的方式编译和链接。
由上面两个特点可以保证使用该头文件的 C 或 C++ 程序都统一按照 C 的方式找到编译后的函数符号,而无论这个函数之前是由 C 或 C++ 编译的。
使用例子
Linux 中所有的系统头文件、标准 C 头文件的开头和结尾部分都会分别包含 __BEGIN_DECLS 和 __END_DECLS 两个宏。这两个宏是在 sys/cdefs.h 中定义的,系统标准头文件一般都会通过 features.h 间接包含。下面是这两个宏的定义:
/* C++ needs to know that types and declarations are C, not C++.  */
#ifdef  __cplusplus
# define __BEGIN_DECLS  extern "C" {
# define __END_DECLS    }
#else
# define __BEGIN_DECLS
# define __END_DECLS
#endif
只要能理解前面的范例头文件,就能明白系统头文件要这样设计的意图了:即能让 C++ 程序按照 C 的方式链接和使用 C 函数库。
同样的使用原理还可以在 glib 库中看到。所有的 glib 头文件都会包含一对  G_BEGIN_DECLS
和 G_END_DECLS
宏,它们是在 glib/gmacros.h 中定义的。这样 glib 库也能被 C++ 程序使用。


相关文档:

(转)C/C++中时间函数的介绍

1.概念
       在C/C++中,对字符串的操作有很多值得注意的问题,同样,C/C++对时间的操作也有许多值得大家注意的地方。最近,在技术群中有很多网友也多次问到过C++语言中对时间的操作、获取和显示等等的问题。下面,在这篇文章中,笔者将主要介绍在C/C++中时间和日期的使用方法.  ......

Ubuntu(Linux)使用Eclipse搭建C/C++编译环境

这两天,给自己电脑弄了双系统,除了原来的Windows 7系统外,装上了Linux系统,使用的版本是Ubuntu
(点
击可到相应的下载页面)。开始我装的Linux版本是fedora9,对于一个根本没接触过Linux系统的人而言,使用fedora,简直让人崩溃。更
崩溃的是,我用的英文版。没的办法,又重新下载Linux,刻碟。装系统。装系统的时候 ......

C 的开始

    C 的开始
 
    2010年2月10日,
    开始阅读家里有关"C语言"的各种资料。
    使用 TurboC2.0,偶尔可能也会用到 Microsoft Visual C++ 6.0。 ......

C/C++中左值和右值的差别

我们常说的左值lvalue和右值rvalue并不简单地意味着左右区别,它的原始定义如下:
Definition:
C and C++ have the notion of lvalues and rvalues associated with
variables and constants. The rvalue is the data value of the variable,
that is, what information it contains. The "r" in rvalue can ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号