部分c高级笔记

发布 2020-01-02 10:00:28 阅读 8491

#include

> 直接按标准目录搜索。

” 先在当前目录搜索,再搜索标准目录。

处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译。

#if 、 #else

#elif 、 #endif

条件编译指令中最常用的或许是#if,#else,#elif和#endif

#if的一般形式是:

#if constant-expression

statement sequence

#endif

#endif标记#if块的结束

例子:#ifdef computer_a

define integer_size 16

#elsedefine integer_size 32

#endif

#else指令的作用与c语言的else相似,#if指令失败时它可以作为备选指令

#else既是标记#if块的结束,也标记#else块的开始

每个#if只能写一个#endif匹配。

#ifdef --如果已定义

#ifdef的一般形式如下:

#ifdef 标识符。

程序段1#else

程序段2#endif

当所指定的标识符已经被#define命令定义过,则在程序编译阶段只编译程序段1,否则编译程序段2。

#ifndef --如果未定义

#ifdef的一般形式如下:

#ifndef 标识符。

程序段1#else

程序段2#endif

作用是当所指定的标识符未被#define命令定义过,则在程序编译阶段只编译程序段1,否则编译程序段2。它只是第一行与第一种形式不同。这种形式与第一种形式的作用相反#ifndef

#if --如果已定义

#if 的一般形式如下:

#if 常量表达式。

程序段1#else

程序段2#endif

如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译

#ifdef 和 #if defined 的区别在于,后者可以组成复杂的预编译条件,比如。

#if defined (aaa) &defined (bbb)

xxxxxxxxx

#endif

#if defined (aaa) |version > 12

xxxxxxxxx

#endif

而#ifdef 就不能用上面的用法,也就是说,当你要判断单个宏是否定义时#ifdef 和 #if defined 效果是一样的,但是当你要判断复杂的条件时,只能用 #if

#error

使用defined

#line

#pragma

#和##预宏定义。

#error指令强制编译程序停止编译,主要用于程序调试

#error指令的一般形式是

#error error-message

注意: 宏串error-message不用双引号包围

可以自定义错误内容。

defined

确定是否定义宏名字的方法

defined操作符的一般形式如。

defined macro-name

define与#ifdef:

#if defined my 或 #ifdef my

感叹号”!”来反转相应的条件

#if !defined debug

printf(“final version!”);

#endif

_file__

c语言中的__file__用以指示本行语句所在源文件的文件名,举例如下(

#include <>

2. int main()

在gcc编译生成执行后输出结果为:

在windows的vc6.0下编译执行结果为:

c:\documents and settings\administrator\桌面\

_line__

c语言中的__line__用以指示本行语句在源文件中的位置信息,举例如下:

#include <>

5. main()

该程序在linux用gcc编译,在windows的vc6.0下编译都可以通过,执行结果都为:

还可以通过语句#line来重新设定__line__的值,举例如下:

#include <>

#line 200 //指定下一行的__line__为200

5. main()

编译执行后输出结果为:

另外gcc还支持__func__,它指示所在的函数,但是这个关键字不被windows下的vc6.0支持,举例如下:

#include <>

2. void main()

其编译后输出结果为。

this is print by function main

注意 “#line”、 line__”file__"及 “_func__"都是大小写敏感的。

操作符#通常称为字符串化的操作符

#include <>

#define mkstr(s) br#int main(void)

printf(mkstr(i like c));

return 0;

预处理程序把以下的语句:

printf(mkstr(i like c));

变成。printf(“i like c”);

操作符####”可以把两个独立的字符串连接成一个字符串

#include<>

#define sort(x) sort_function ## x

void main(void)

char *array;

int elements,element_size;.

sort(3) (array,elements,element_size);

执行结果是:

sort(3) 转化为sort_function3

sort(3) (array,elements,element_size)转化为。

sort_function3(array,elements,element_size)

__date__ 进行预处理的日期(“mmm dd yyyy”形式的字符串文字)

__file__ 代表当前源**文件名的字符串文字。

__line__ 代表当前源**中的行号的整数常量。

__time__ 源文件编译时间,格式微“hh:mm:ss”

__func__ 当前所在函数名

realloc,malloc,calloc的区别。

三个函数的申明分别是:

void* realloc(void* ptr, unsigned newsize);

void* malloc(unsigned size);

void* calloc(size_t numelements, size_t sizeofelement);

都在函数库内

它们的返回值都是请求系统分配的地址,如果请求失败就返回null

malloc用于申请一段新的地址,参数size为需要内存空间的长度,如:

char* p;

p=(char*)malloc(20);

calloc与malloc相似,参数sizeofelement为申请地址的单位元素长度,numelements为元素个数,如:

char* p;

p=(char*)calloc(20,sizeof(char));

这个例子与上一个效果相同

realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度

如: char* p;

p=(char*)malloc(sizeof(char)*20);

p=(char*)realloc(p,sizeof(char)*40);

注意,这里的空间长度都是以字节为单位。

c语言的标准内存分配函数:malloc,calloc,realloc,free等。

malloc与calloc的区别为1块与n块的区别:

malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。

calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。

realloc调用形式为(类型*)realloc(*ptr,size):将ptr内存大小增大到size。

free的调用形式为free(void*ptr):释放ptr所指向的一块内存空间。

c++中为new/delete函数。

c语言中const的用法。

基本解释 const是一个c语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性,另外,在**别人**的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。

虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题。

问题:const变量 & 常量

为什么我象下面的例子一样用一个const变量来初始化数组,ansi c的编译器会报告一个错误呢?

const int n = 5;

int a[n];

答案与分析:

1)、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, “abc”,等,肯定是只读的,因为程序中根本没有地方存放它的值,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。

c语言关键字const就是用来限定一个变量不允许被改变的修饰符(qualifier)。上述**中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ansi c规定数组定义时维度必须是“常量”,“只读变量”也是不可以的。

2)、注意:在ansi c中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 !=不可变的变量,但在标准c++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是 ansi c对数组的规定限制了它。

3)、那么,在ansi c 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。

问题:const变量 & const 限定的内容。

下面的**编译器会报一个错误,请问,哪一个语句是错误的呢?

Oracle高级部分笔记

oracle高级部分 开整。pl sql简介。pl sql是结构化查询语言 sql 和oracle过程语言 pl 的扩展集。可以通过pl sql完成这样的事情比如 存储过程,存储函数,触发器 包括程序包。也就是说 pl sql也是一种编辑器,那么pl sql也是一门语言。pl sql程序。所有的pl...

我的C语言笔记高级

数组。1排序分交换法,选择法,插入排序,冒泡法,快速排序法。2交换法第i轮比较中,第i 1个数和后面所有的数都有一次比较,每进行一次比较,若后面的数大酒交换位置,每轮最多交换n i次很耗资源。第一轮 84 83 88 87 61不交换。交换。不交换。不交换。第二轮 88 83 84 87 61交换。...

C高级编程课堂笔记全

main函数的写法 void main 两个都为1才得1 只要有一个为1则得1value 相同得0,不同得1 乘以2的次方倍。除以2的次方倍。if condition a condition b 如果condition a不成立则不对condition b进行判断,直接返回。则对condition ...