随笔分类 - C/C++
1
摘要:上一节解读了C程序中函数指针及回调函数的写法,本节再看一下函数指针另一个较为广泛的应用-驱动表程序,在这之前,首先需要了解函数指针数组的使用,依旧通过最简单最容易理解的例子来讲解。 首先看下面这个函数指针数组的使用实例。#include <stdio.h>
#include <stdlib.h> int Sum(int a, int b)
{ return a + b;
} int Sub(int a, int b)
{ return a - b;
} typedef int (*pfFun)(int, int); int TestFun(int a, int b,..
阅读全文
摘要:函数指针从名子上看就知道它也是一种指针,一个指向函数入口地址的指针,举个简单的例子来看看函数指针的用法。1、通过函数指针调用函数。#include <stdio.h>
#include <stdlib.h> int Sum(int a, int b)
{ return a + b;
} int Sub(int a, int b)
{ return a - b;
} int main(int argc, char *argv[])
{ int iTmp = 0; int (*pf)(int, int); /*申明一个函数指针,它带有两个整形参数,返回一个整形*/ ...
阅读全文
摘要:通过实例来看看const所修饰的指针使用方法:1、 先看一个普通的指针使用。 形式:int *pTmp 含义:一个普通的指向int类型的指针int main(int argc, char *argv[])
{ int i = 1; int *pTmp = &i; printf("pTmp = %d\n", *pTmp); i = 2; printf("pTmp = %d\n", *pTmp); (*pTmp)++; printf("pTmp = %d\n", *pTmp); system("PAUSE");
阅读全文
摘要:一、先看看下面的小程序:#include <stdio.h>
#include <stdlib.h> typedef struct _STSTAFFINFO
{ char *pName; /*姓名*/ int iId; /*ID*/ }stStaffInfo; /*根据ID获取姓名*/
char* GetStaffNameById(int iId)
{ int i; stStaffInfo stTmpInfo[] = { {"Socrates", 1}, {"dyx1024", 2}, ...
阅读全文
摘要:最近重读C专家编程,记录一些重点,做为学习笔记。 在C程序中,以下操作符的优先级不是很好区分(如果你不使用括号显示指明的话),列举如下:优先级问题表达式可能误认为的结果实际结果.的优先级高于*->操作符用于消除这一问题*p.fp所指对象的字段f。(*p).f对p取f偏移,作为指针,然后进行解除引用操作。*(p.f)[]高于*int *ap[]ap是指向int数组的指针。int (*ap)[]ap是个元素为int指针的数组。int *(ap[])函数()高于*int *fp()fp是个函数指针,所指函数返回int。int(*fp)()fp是个函数,返回int *int *(fp())==和
阅读全文
摘要:python作为动态语言,开发效率相当高,但如我们所知,动态语言的执行效率往往是比较低的,请看下面简单的测试过程:一、 C语言实现100万次打印: 代码:#include<stdio.h>#include <time.h>int main(int argc, char* argv[]){ unsigned long i = 1; unsigned long ulNum = 1000000; clock_t start, finish; double duration; start = clock(); while (ulNum != 0) { printf("
阅读全文
摘要:早上看到好友未央的一篇博文《一道google的测试工程师笔试题》,内容如下:这是去年面试google测试工程师的一道题,题目如下: 设计一个函数,使用任意语言,完成以下功能: 一个句子,将句子中的单词全部倒排过来,但单词的字母顺序不变。比如,This is a real world,输出结果为world real a is this. 他用C++很好的封装了一个函数实现了此功能,如下,更多信息请访问:http://www.itsbug.com/?p=208C++版本:#include <iostream> #include <string.h> using namesp
阅读全文
摘要:今天看了一下SQLITE的资料,边学习边练习了下,主要涉及到数据库打开,建表、插入记录、查询、关闭数据库等操作,SQLITE支持多种编程语言来操作,今天用C做为实现工具,具体方法如下:1 开发环境: 操作系统: windows xp 代码编译器:SI 编译器:DEV C++ API库:sqlite3 其中日志记录使用我自己写的一个日志操作文件,见本博客文章《简单的分级别写日志程序》2 实现代码:main.c#include <stdio.h>#include <stdlib.h>#include <string.h>#include "./sqli
阅读全文
摘要:1.qsort排序/* qsort example */#include <stdio.h>#include <stdlib.h>int values[] = { 40, 10, 100, 90, 20, 25 };int compare (const void * a, const void * b){ return ( *(int*)a - *(int*)b );}int main (){ int n; qsort (values, 6, sizeof(int), compare); for (n=0; n<6; n++) printf ("%d &
阅读全文
摘要:使用开源软件最大的一个好处就是能够看到它的实现,便于更深入地学习,这几天正在看pg_ctl的源码,先贴出源码,随后的时间里对各函数一一分析,,顺便测试一下这个编辑器最多支持多少行。呵呵。/*------------------------------------------------------------------------- * * pg_ctl --- start/stops/restarts the PostgreSQL server * * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Grou.
阅读全文
摘要:18.6.3 浮点优化 一些没有包含在-o级别中的优化选项属于浮点操作,C99标准支持科学记数和高精度的浮点型,但是对于一个应用程序,你可能更关心运行速度而非浮点型变量本身,因此,-ffast-math选项定义了预处理宏__FAST_MATH__ ,指示编译器不用依赖于IEEE和ISO的浮点数学标准,--ffast-math是一组选项,具有下面六个独立选项:-fno-math-errno禁止在数学函数中使用全局变量error。-funsafe-math-optimizations“不安全的数学优化”是指那些可能违反浮点数学标准,或者没有确认的参数和结果。-fno-trapping-math产生
阅读全文
摘要:18.6.2 选项-fGCC提供许多-f选项供你进行编译优化,例如,你可以使用-o选项来设置一个普通优化项,并关闭某一个技巧,例如:$ gcc -Wall -O3 -fno-inline-functions -o circle circle.c circulararea.c –lm选项-o3 –fno-inline-functions启用-o3组中的内联函数外的所有优化项。当然还有标志可以启用许多优化项,这些并不包含在任务-o级别中,例如 –funroll-loops,此选项替代loop语句,所有-f选项有上百个,在本节中无法一一描述,但本节的例子中提供了一个思路,如果你需要某几个编译器特性,
阅读全文
摘要:18.6 优化GCC有很多技术可以使用执行文件生成更快更小,这些技巧趋向于减少程序与机器码间的逐字通信速度,它可能使用调试变得很困难,通常用于程序已经被测试和调试过之后。有两种优化选项,你可以通过-f开始的选项来单独地使用它们,例如-fmerge-constants,它将使用编译器将相同的常量放置在一个通用的地址,甚至交叉于不同的源文件,也可以使用-o选项(-o0, -o1, -o2和-o3)来设置优化级别,它可以一次性启用许多优化技巧。18.6.1 选项-O的级别每一个-o选项代表许多独立的优化技巧,-o优化级别是累加的,-o2包含了-o1中的所有优化项,-o3包含-o2, 想了解不同级别的
阅读全文
摘要:18.5 编译警告当编译一个C程序时,有两类麻烦,一是错误信息,这使用你不能完成编译;另一种是警告,它提示你应该遵循严格的标准,便不会中止编译,你也可以不用理会驼些告警,直接运行程序,但这不是一个好主意。GCC提供非常好的警告控制,例如,你不喜欢区分错误和警告,可以使用-Werror选项使用GCC在出现任务警告时停止编译,就跟出现错误一样。其他的选项支持古老的或非标准的告警控制。使用选项-W可以启用GCC个别的告警,例如,选项-Wswitch-default提示GCC当使用了switch语句,但没有带default标签时出现一个警告。使用GCC中的这些警告最简单的方法是在命令行中使用-Wall
阅读全文
摘要:18.4 C方言当编写一个C程序时,首先要做的一件事是确定在多种C的定义中遵循哪一种,GCC的默认方言版本为“GNU C”,它在很大程度上为ISO/IEC 9899:1900标准,以及它发布的勘误表和许多语言扩展,这些扩展一部分已经包含在C99中标准化了,例如复杂浮点类型和long long整形,另外一部分特性没有被采用,例如,复杂整形类型和长度为0的数组,全部的扩展列表在GCC文档中有提供。要关闭所有GNU C的扩展,可以使用命令行选项 –ansi, 本书以ISO/IEC 9899:1999 (或C99)来进行描述。GCC语言标准化选项有:-std=iso9899:1990, -std=c8
阅读全文
摘要:18.3.4 独立程序除去在GCC命令行中指定的object文件和库文件外,连接器必须连接一些程序启动时所需要的与操作系统强相关的代码,这些代码存在在标准obect文件ctr0.o中,其包含执行程序的入口点(crt代表”C runtime.”),在大多数系统上,GCC也使用默认的object文件crtbegin.o和ctrend.o来连接初始代码。然而,如果你在写一个独立程序,例如操作系统或一个嵌入式程序,可以使用-ffreestanding和-nostartfiles选项来指示GCC不连接这些代码,选项-nostdlib允许你不使用C标准库,如果你使用此选项,你必须提供程序所使用的其他版本的
阅读全文
摘要:18.3.3.3 动态链接和共享object文件共享库为特殊的object文件,它们可以在运行时被连接到程序中来,使用共享链接库具有许多优点:执行文件较小;共享模块允许更新;高效。创建一个共享object文件,可使用GCC的-shared选项目,输入必须是一个存在的object文件。下面是一个简单的例子:$ gcc -c circulararea.c$ gcc -shared -o libcirculararea.so circulararea.o上面第二条命令创建了共享object文件libcirculararea.so,将一个可执行程序与共享object文件连接,在命令和中像使用其他obj
阅读全文
摘要:18.3.1.5 所有输出 GCC有另外一个选项-save-temps,可以便利地一次性获得所有中间输文件。当你使用此选时,GCC正常地进行编译和连接,但将会在当前目录下保存预处理的输出、汇编语句、object文件。使用-save-temps选项生成的文件名与源文件名相同,对于预处理输出、汇编语句、object文件,后缀分别为.i,.s和.o。18.3.1.6 无一输出如果使用-fsyntax-only选项,GCC将不会进行预处理、编译、装配、或连接,它仅仅测试输入文件的语法,具体可参见本章后面的“编译警告”一节。18.3.2 多个输入文件在第一章中,我们将circle.c分成两个文件,编译多
阅读全文
摘要:18.3.1.4 连接 连接器将多个二进制的object文件连接成为一个可执行文件,在进程中,它完成使用外部引用来替换程序中本地对象的引用。连接器依据汇编器提供的符号表来完成这些工作。 此外,连接器必须为程序中使用的C标准库的函数添加代码,在连接的上下文中,一个库就是一系列object文件的集合,为了便于处理,它们以归档文件的形式被集合在一个独立的文件中。 大多数标准函数库通常在文件libc.a中(其中后缀.a代表“archive”),或者在一个共享的动态连接库libc.so中( 其中后缀.so代表“shared object”)。这些库通常在/lib/ 或/usr/lib中,或者在GCC默认
阅读全文
摘要:18.3.1 进阶 下面的小节介绍GCC的选项,使用你可以控制编译过程的每个阶段:预处理、编译、装配和连接。你也可以执行单独的步骤来调用单独的工具,例如C预处理器cpp,汇编程序as,连接器ld,GCC也可被配置来使用指定主机上的外部程序,为了统一,本章描述如何执行这四步来控制程序。18.3.1.1 预处理 在将程序向实际的编译器提交前,预处理器执行指示符和扩展源代码中的宏,GCC通常不会保留预处理阶段的结果,但是你可以使用-E选项将预处理阶段输出保存下来以便以后诊断程序时使用。此选项将使用GCC在预处理完成后停止。预处理器直接将结果输出在标准输出设备上。除非你使用-o选项指定一个输出文件名。
阅读全文
1

浙公网安备 33010602011771号