初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
对于变量
struct sample_strcut stTest;
一般情况下,清空stTest的方法:
stTest.csName[0]=’/0’;
stTest.iSeq=0;
stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
如果是数组:
struct sample_struct TEST[10];
则
memset(TEST,0,sizeof(struct sample_struct)*10);
#define: 定义一个预处理的宏
#undef :取消宏的定义
#if :编译预处理中的条件命令,相当于C语法中的if语句
#ifdef:判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef : 与#ifdef相反,判断某个宏是否未被定义
#elif : 若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
#else:与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
#endif : #if, #ifdef, #ifndef这些条件命令的结束标志.
defined :与#if, #elif配合使用,判断某个宏是否被定义
#if 0 …#endif :不会被编译。在代码中留下暂时不用,但可能有价值的代码。
#error :停止编译并显示错误信息
反斜杠起到换行作用,用于宏定义和字符串换行,宏定义居多。
如果一行代码有很多元素,太长影响阅读,可以通过在结尾加“\”的方式,实现换行,编译时会忽略“\”及其后的换行符,当做一行处理。
在宏定义中,要换行必须使用“\”结尾。
例:
// 按取消键退出
#define RETURN_CANCEL(ucRet)\
{\
if (EM_key_CANCEL == ucRet)\
{\
return ET_IGNORE;\
}\
}
_FILE_、_line_、_func_、#line
注:"_FILE_
"、"_LINE_
"、"_func_
"、"#line
"均大小写敏感
_FILE_
用于指示本行代码所在源文件的文件名;
_LINE_
用于指示本行代码所在源文件中的位置(行数);
_func_
用于指示本行代码所在函数(函数名);
#line用于重新设定下一行代码的行数;
memcpy是memory copy的缩写,内容复制,它的函数原型:
void *memcpy(void *dest, const void *src, size_t n);
它的功能是从src的开始位置拷贝n个字节的数据到dest。如果dest存在数据,将会被覆盖。memcpy函数定义在string.h头文件里。
memcpy() 并不关心被复制的数据类型,只是逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据类型进行复制。
(1)dest 指针要分配足够的空间,也即大于等于 num 字节的空间。如果没有分配空间,会出现断错误。
(2)dest 和 src 所指的内存空间不能重叠(如果发生了重叠,使用 memmove() 会更加安全)。
(3)与 strcpy() 不同的是,memcpy() 会完整的复制 num 个字节,不会因为遇到“\0”而结束。
【返回值】返回指向 dest 的指针。注意返回的指针类型是 void,使用时一般要进行强制类型转换。
const定义常变量后,该变量没有写权限,只有读权限
规则:(1)const离谁近,谁就不能被修改;
(2)const修饰一个变量时,一定要给这个变量初始化,若不初始化,在后面也不能初始化。
表示以16进制的格式输出整数类型的数值,输出域宽为2,不足的用字符0代替。
例:
printf("%02X\n",a);
printf("%03X\n",a);
printf("%04X\n",a);
运行后输出结果为:
0F
00F
000F
用于将C++代码以标准C形式输出。C++编译器与C的编译器不同,C中调用C++的代码这样定义安全。
#ifdef __cplusplus
extern "C"{
//... 正常的声明段
}
#endif