摘要: #ifndef 它是if not define 的简写,是宏定义的一种,实际上确切的说,这应该是预处理功能三种(宏定义、文件包含、条件编译)中的一种----条件编译。 在c语言中,对同一个变量或者函数进行多次声明是不会报错的。所以如果h文件里只是进行了声明工作,即使不使用# ifndef宏定义,多个c文件包含同一个h文件也不会报错。 但是在c++语言中,#ifdef的作用域只是在单个文件中。所以如果h文件里定义了全局变量,即使采用#ifdef宏定义,多个c文件包含同一个h文件还是会出现全局变量重定义的错误。使用#ifndef可以避免下面这种错误:如果在h文件中定义了全局变量,一个c文件包... 阅读全文
posted @ 2013-10-24 21:18 wmlhust 阅读(79171) 评论(1) 推荐(15) 编辑
摘要: C/C++编译过程C/C++编译过程主要分为4个过程1)编译预处理2)编译、优化阶段3)汇编过程4)链接程序一、编译预处理(1)宏定义指令,如#defineNameTokenString,#undef等。对于前一个伪指令,预编译所要做的是将程序中的所有Name用TokenString替换,但作为字符串常量的Name则不被替换。对于后者,则将取消对某个宏的定义,使以后该串的出现不再被替换。(2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必 阅读全文
posted @ 2013-10-24 20:35 wmlhust 阅读(682) 评论(0) 推荐(0) 编辑
摘要: 备:对于#include ,编译器从标准库路径开始搜索 filename.h 对于#include “filename.h” ,编译器从用户的工作路径开始搜索 filename.h今天有人问我: #include能不能include一个(多个.c文件)?偶的回答是:从理论上讲可以,但是不推荐。 为什么经常见到include .h文件而不是include .c文件?或者说include是不是就是为包含.h文件设定的语法?这个问题的答案偶不知道,没有见有文档记载、说明这个问题。不过从语法角度讲,include的意思就是从当前位置包含另外一个文件,就象宏替换一样把当前行用另外一个文件的整个内容替.. 阅读全文
posted @ 2013-10-24 20:32 wmlhust 阅读(427) 评论(0) 推荐(0) 编辑
摘要: 前几天看了《程序员的自我修养——链接、装载与库》中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧。我现在一般都是用gcc,所以自然以GCC编译hellworld为例,简单总结如下。hello.c源代码如下:View CodeC123456#include int main(){ printf(“Hello, world.\n”); return 0;}通常我们使用gcc来生成可执行程序,命令为:gcc hello.c,默认生成可执行文件a.out其实编译(包括链接)的命令:gcc hello.c 可分解为如下4个大的步骤:预处理(Preprocessing)编译(Co 阅读全文
posted @ 2013-10-24 20:29 wmlhust 阅读(511) 评论(0) 推荐(0) 编辑
摘要: .c文件就是C语言系列的源文件,而H文件则是C语言的头文件,即C系列中存放函数和全局变量的文件,因为C中的函数是被封装起来的,即无法看到其代码。 子程序不要定义在*.h中。函数定义要放在*.c中,而*.h只做声明.否则多引用几次,就会发生函数重复定义的错误。*.h只做声明,编译后不产生代码。这样做目的是为了实现软件的模块化,使软件结构清晰,而且也便于别人使用你写的程序。 纯粹用 C 语言语法的角度,你当然可以在*.h 中放任何东西,因为#include 完全等价于把*.h 文件 Ctrl-C Ctrl-V 到*.c 中,*.h 中应该都是一些宏定义和变量、函数声明,告诉别人你的程序“能... 阅读全文
posted @ 2013-10-24 20:24 wmlhust 阅读(584) 评论(0) 推荐(0) 编辑
摘要: 字节序,即字节在电脑中存放时的序列与输入(输出)时的序列,是先到的在前,还是后到的在前。常见序:1. LE Little endian:最符合人的思维的字节序,将低序字节存储在起始地址,地址低位存储值的低位,地址高位存储值的高位2. BE big-endian:最直观的字节序,地址低位存储值的高位,地址高位存储值的低位。例子:在内存中双字 0x01020304 的存储方式内存地址:4000&4001&4002&4003 LE: 04 03 02 01 BE: 01 02 03 04x86系列CPU都是little-endian的字节序网络序:网络字节顺序是TCP/IP中 阅读全文
posted @ 2013-10-24 20:09 wmlhust 阅读(408) 评论(0) 推荐(0) 编辑