易截截图软件、单文件、免安装、纯绿色、仅160KB
热门标签: c c# c++ asp asp.net linux php jsp java vb Python Ruby mysql sql access Sqlite sqlserver delphi javascript Oracle ajax wap mssql html css flash flex dreamweaver xml
 最新文章 : c++

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”含义深层探索

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” ......

50个c/c++源代码网站

C/C++是最主要的编程语言。这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码 。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C++源代码的网站。这不是一个完整的清单,您有建议可以联系我,我将欢迎您的建 议,以进一步加强这方面的清单。 
1、http://snippets.dzone.com/tag/c/ --数以千计的有用的C语言源代码片段 
2、http://www.hotscripts.com/category/c-cpp/scripts-programs/ Hotscripts --提供数以百计的C和C++脚本和程序。所有程序都分为不同的类别。 
3、http://www.planetsourcecode.com/vb/default.asp?lngWId=3 --超过万行C和C++免费的源代码 
4、http://freshmeat.net/browse/164/ --超过9000个C编写的项目。 
5、http://www.daniweb.com/code/c.html --DANIWEB提供的实用代码段 。 
6、http://www.programmersheaven.com/tags/C/ --programmersheaven.com上的C编程资源。 
7、http://www.ddj.com/code/ddj.html --Dr. Dobb’s Journal的源代码。 
8、http://www.cprogramming.com/cgi-bin/source/source.cgi --C和C + +编程资 ......

50个c/c++源代码网站

C/C++是最主要的编程语言。这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码 。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C++源代码的网站。这不是一个完整的清单,您有建议可以联系我,我将欢迎您的建 议,以进一步加强这方面的清单。 
1、http://snippets.dzone.com/tag/c/ --数以千计的有用的C语言源代码片段 
2、http://www.hotscripts.com/category/c-cpp/scripts-programs/ Hotscripts --提供数以百计的C和C++脚本和程序。所有程序都分为不同的类别。 
3、http://www.planetsourcecode.com/vb/default.asp?lngWId=3 --超过万行C和C++免费的源代码 
4、http://freshmeat.net/browse/164/ --超过9000个C编写的项目。 
5、http://www.daniweb.com/code/c.html --DANIWEB提供的实用代码段 。 
6、http://www.programmersheaven.com/tags/C/ --programmersheaven.com上的C编程资源。 
7、http://www.ddj.com/code/ddj.html --Dr. Dobb’s Journal的源代码。 
8、http://www.cprogramming.com/cgi-bin/source/source.cgi --C和C + +编程资 ......

printf画的俄罗斯方块(linux异步I/O,C++)

这个方块游戏是用linux终端的光标控制、颜色设置做的
(添了个功能,字母P暂停、恢复游戏)
用 A S D W 控制移动、转向,空格键下坠到底;
linux的异步aio函数解决了很多麻烦;
用了个简单的模板单例模式,继承它就可以;
对POSIX线程简单封装成java线程接口;
#include <memory>
#include "Tetris.h"
#include "TtyAuto.h"
static void instruction()
{
// 一些说明性文字
printf("\033[2J");
printf("\033[4;34;47m%s\033[0m", "\t\t\tYou can use the key 'A','S','D','W' to control the block.\n\n\t\t\tPress space key make the block down to bottom.\n\n\t\t\t'P' to pause the game.\n\n");
printf("\033[5;34;41m%s\033[0m", "\t\t\tPRESS ANY KEY TO START GAME...\n\n" );
getchar();
}
int main(int ac, char *av[])
{
std::auto_ptr<TtyAuto> autoAdjustTty(TtyAuto::getInstance());
instruction();
// 游戏开始
Tetris game;
game.start();
game.join();
printf("\r\t\t\t\t\t\r");
return 0;
}

#ifndef BERT_THREAD_H
#define BERT_THREAD_H
#include <pthread.h>
/**
* 线程封装,接口模 ......

printf画的俄罗斯方块(linux异步I/O,C++)

这个方块游戏是用linux终端的光标控制、颜色设置做的
(添了个功能,字母P暂停、恢复游戏)
用 A S D W 控制移动、转向,空格键下坠到底;
linux的异步aio函数解决了很多麻烦;
用了个简单的模板单例模式,继承它就可以;
对POSIX线程简单封装成java线程接口;
#include <memory>
#include "Tetris.h"
#include "TtyAuto.h"
static void instruction()
{
// 一些说明性文字
printf("\033[2J");
printf("\033[4;34;47m%s\033[0m", "\t\t\tYou can use the key 'A','S','D','W' to control the block.\n\n\t\t\tPress space key make the block down to bottom.\n\n\t\t\t'P' to pause the game.\n\n");
printf("\033[5;34;41m%s\033[0m", "\t\t\tPRESS ANY KEY TO START GAME...\n\n" );
getchar();
}
int main(int ac, char *av[])
{
std::auto_ptr<TtyAuto> autoAdjustTty(TtyAuto::getInstance());
instruction();
// 游戏开始
Tetris game;
game.start();
game.join();
printf("\r\t\t\t\t\t\r");
return 0;
}

#ifndef BERT_THREAD_H
#define BERT_THREAD_H
#include <pthread.h>
/**
* 线程封装,接口模 ......

C与C++文件互相调用

时常在cpp的代码之中看到这样的代码:
#ifdef __cplusplus 
extern "C" { 
#endif
//一段代码
#ifdef __cplusplus 

#endif 
    这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{和}处理其中的代码。
  要明白为何使用extern "C",还得从cpp中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的. 目的就是主要实现C与C++的相互调用问题。
c.h的实现
#ifndef _c_h_
#define _c_h_
#ifdef __cplusplus
extern "C" {
#endif
void C_fun();
#ifdef __cplusplus
}
#endif
#endif
-----------------------------------
c.c的实现
#include "c.h"
void C_fun()
{
}
------------------------------------
在cpp.cpp中调用c.c中的C_test()
cpp.cpp的实现
#include "c ......

C与C++文件互相调用

时常在cpp的代码之中看到这样的代码:
#ifdef __cplusplus 
extern "C" { 
#endif
//一段代码
#ifdef __cplusplus 

#endif 
    这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{和}处理其中的代码。
  要明白为何使用extern "C",还得从cpp中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的. 目的就是主要实现C与C++的相互调用问题。
c.h的实现
#ifndef _c_h_
#define _c_h_
#ifdef __cplusplus
extern "C" {
#endif
void C_fun();
#ifdef __cplusplus
}
#endif
#endif
-----------------------------------
c.c的实现
#include "c.h"
void C_fun()
{
}
------------------------------------
在cpp.cpp中调用c.c中的C_test()
cpp.cpp的实现
#include "c ......

高质量C++/C编程指南

http://man.lupaworld.com/content/develop/c&c++/c/c.htm
1. 如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改
2. 在函数体的“入口处”,对参数的有效性进行检查
    在函数体的“出口处”,对return语句的正确性和效率进行检查
3. 引用的一些规则如下:
  (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
  (2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
  (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
 
4. 内存分配方式有三种:
 (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
 (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内     置        于处理器的指令集中,效率很高,但是分配的内存容量有限。
 (3) ......

高质量C++/C编程指南

http://man.lupaworld.com/content/develop/c&c++/c/c.htm
1. 如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改
2. 在函数体的“入口处”,对参数的有效性进行检查
    在函数体的“出口处”,对return语句的正确性和效率进行检查
3. 引用的一些规则如下:
  (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
  (2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
  (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
 
4. 内存分配方式有三种:
 (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
 (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内     置        于处理器的指令集中,效率很高,但是分配的内存容量有限。
 (3) ......

【linux】c++ 内存管理(一)

1. 内存分配方式
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如:全局变量,static变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束的时候这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很搞,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态分配。程序在运行的时候用malloc或new申请人已多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
 
2. 常见的内存错误及对策
(1) 内存分配未成功,却是用了它。
对策:使用前检查内存指针是否为NULL,如果指针P是函数的参数,在函数的入口处用assert( p != NULL )进行检查。如果是用malloc或new来申请内存,应该用if( p == NULL)或if( p != NULL )进行放错处理。
(2) 内存分配虽然成功,但是尚未初始化就引用它。
错误原因: 没有初始化观念;误以为内存的缺省初始值全为零。导致引用初值错误(例如数组)
(3) 内存分配成功且已经初始化,但操作越过了内存的边界。
(4) 忘记了释放内存,造成内存泄露。
  & ......

【linux】c++ 内存管理(一)

1. 内存分配方式
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如:全局变量,static变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束的时候这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很搞,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态分配。程序在运行的时候用malloc或new申请人已多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
 
2. 常见的内存错误及对策
(1) 内存分配未成功,却是用了它。
对策:使用前检查内存指针是否为NULL,如果指针P是函数的参数,在函数的入口处用assert( p != NULL )进行检查。如果是用malloc或new来申请内存,应该用if( p == NULL)或if( p != NULL )进行放错处理。
(2) 内存分配虽然成功,但是尚未初始化就引用它。
错误原因: 没有初始化观念;误以为内存的缺省初始值全为零。导致引用初值错误(例如数组)
(3) 内存分配成功且已经初始化,但操作越过了内存的边界。
(4) 忘记了释放内存,造成内存泄露。
  & ......
总记录数:969; 总页数:162; 每页6 条; 首页 上一页 [51] [52] [53] [54] 55 [56] [57] [58] [59] [60]  下一页 尾页
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号