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 + +编程资 ......
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 + +编程资 ......
时常在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 ......
时常在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 ......
本文介绍在GNU/Linux环境下一个C程序由源代码到程序,到加载运行,最后终止的过程。同时以此过程为载体,介绍GNU/Linux平台下软件开发工具的使用。
本文以我们最常见的hello, world!为例:
#include <stdio.h>
main ()
{
printf(“hello, world!\n”);
}
C程序生成
下图是一个由C源代码转化为可执行文件的过程:
代码编辑: 比较流行的编辑器是GNU Emacs和vim。Emacs具有非常强大的功能,并且可扩展。
编译:包括编译预处理,编译,汇编,连接过程。它们都可以通过GCC来实现。关于GCC,可以参考我关于GCC的笔记。
C编译器将源文件转换为目标文件,如果有多个目标文件,编译器还将它们与所需的库相连接,生成可执行模块。当程序执行时,操作系统将可执行模块拷贝到内存中的程序映象。
程序又是如何执行的呢?执行中的程序称之为进程。程序转化为进程的步骤如下:
1, 内核将程序读入内存,为程序镜像分配内存空间。
2, 内核为该进程分配进程标志符(PID)。
3, 内核为该进程保存PID及相应的进程状态信息。
经过上述 ......
本文介绍在GNU/Linux环境下一个C程序由源代码到程序,到加载运行,最后终止的过程。同时以此过程为载体,介绍GNU/Linux平台下软件开发工具的使用。
本文以我们最常见的hello, world!为例:
#include <stdio.h>
main ()
{
printf(“hello, world!\n”);
}
C程序生成
下图是一个由C源代码转化为可执行文件的过程:
代码编辑: 比较流行的编辑器是GNU Emacs和vim。Emacs具有非常强大的功能,并且可扩展。
编译:包括编译预处理,编译,汇编,连接过程。它们都可以通过GCC来实现。关于GCC,可以参考我关于GCC的笔记。
C编译器将源文件转换为目标文件,如果有多个目标文件,编译器还将它们与所需的库相连接,生成可执行模块。当程序执行时,操作系统将可执行模块拷贝到内存中的程序映象。
程序又是如何执行的呢?执行中的程序称之为进程。程序转化为进程的步骤如下:
1, 内核将程序读入内存,为程序镜像分配内存空间。
2, 内核为该进程分配进程标志符(PID)。
3, 内核为该进程保存PID及相应的进程状态信息。
经过上述 ......
本文介绍在GNU/Linux环境下一个C程序由源代码到程序,到加载运行,最后终止的过程。同时以此过程为载体,介绍GNU/Linux平台下软件开发工具的使用。
本文以我们最常见的hello, world!为例:
#include <stdio.h>
main ()
{
printf(“hello, world!\n”);
}
C程序生成
下图是一个由C源代码转化为可执行文件的过程:
代码编辑: 比较流行的编辑器是GNU Emacs和vim。Emacs具有非常强大的功能,并且可扩展。
编译:包括编译预处理,编译,汇编,连接过程。它们都可以通过GCC来实现。关于GCC,可以参考我关于GCC的笔记。
C编译器将源文件转换为目标文件,如果有多个目标文件,编译器还将它们与所需的库相连接,生成可执行模块。当程序执行时,操作系统将可执行模块拷贝到内存中的程序映象。
程序又是如何执行的呢?执行中的程序称之为进程。程序转化为进程的步骤如下:
1, 内核将程序读入内存,为程序镜像分配内存空间。
2, 内核为该进程分配进程标志符(PID)。
3, 内核为该进程保存PID及相应的进程状态信息。
......
本文介绍在GNU/Linux环境下一个C程序由源代码到程序,到加载运行,最后终止的过程。同时以此过程为载体,介绍GNU/Linux平台下软件开发工具的使用。
本文以我们最常见的hello, world!为例:
#include <stdio.h>
main ()
{
printf(“hello, world!\n”);
}
C程序生成
下图是一个由C源代码转化为可执行文件的过程:
代码编辑: 比较流行的编辑器是GNU Emacs和vim。Emacs具有非常强大的功能,并且可扩展。
编译:包括编译预处理,编译,汇编,连接过程。它们都可以通过GCC来实现。关于GCC,可以参考我关于GCC的笔记。
C编译器将源文件转换为目标文件,如果有多个目标文件,编译器还将它们与所需的库相连接,生成可执行模块。当程序执行时,操作系统将可执行模块拷贝到内存中的程序映象。
程序又是如何执行的呢?执行中的程序称之为进程。程序转化为进程的步骤如下:
1, 内核将程序读入内存,为程序镜像分配内存空间。
2, 内核为该进程分配进程标志符(PID)。
3, 内核为该进程保存PID及相应的进程状态信息。
......
C中的#号不仅是#include,#define等的关键字首使用而已,#在宏中还有很多用法。具体请看下面我来举例
1.双#号的宏用法。
我相信双##号的用法应该大部分人都见过吧,主要是用来连接宏变量名使用,在GCC参考手册中这样记载。
可用于宏内部将两个源代码权标连接成一个的连接指示字,可用来构造不会被解析器错误解释的名字。例如,下面两个宏会实现连接操作:
#define PASTE1(a) a##house
#define PASTE2(a,b) a##b
result = PASTE1(farm);
result = PASTE1(ranch);
result = PASTE2(front,back);
下面是上面预处理的结果
result = farmhouse;
result =ranchhouse;
result = frontback;
这就是双##的用法。
2.单#号的用法。对于单#号的用法。我用一个例子来描述一下
#define tostring(s) #s
#define STRING "Lavf" tostring(52 ##.## 36 ##.## 0)
int main()
{
char *p = STRING;
printf("%s", p);
getchar(); ......
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) ......
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) ......