更改wordpress主题语言包,南京百度快速排名优化,铁岭网站建设网络优化,扬州市工程信息网目录
翻译环境
linux下的测试 编辑
预定义符号
执行环境
#define定义宏
#和##
#
##
宏参数的副作用
宏和函数对比
优点
缺点
#undef 条件编译
头文件包含 在标准c的任何实现中#xff0c;存在两种环境——翻译环境和执行环境 翻译环境 翻译环境生成目标文件…
目录
翻译环境
linux下的测试 编辑
预定义符号
执行环境
#define定义宏
#和##
#
##
宏参数的副作用
宏和函数对比
优点
缺点
#undef 条件编译
头文件包含 在标准c的任何实现中存在两种环境——翻译环境和执行环境 翻译环境 翻译环境生成目标文件.obj) linux下的测试
预定义符号
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C其值为1否则未定义 vs不完全支持c标准Linux下的gcc支持c标准。
执行环境 1. 程序必须载入内存中。在有操作系统的环境中一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排也可能是通过可执行代码置入只读内存来完成。 2. 程序的执行便开始。接着便调用 main 函数。 3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈stack存储函数的局部变量和返回地址。程序同时也可以使用静态static 内存存储于静态内存中的变量在程序的整个执行过程 一直保留他们的值。 4. 终止程序。正常终止 main 函数也有可能是意外终止。 #define定义宏 #define 机制包括了一个规定允许把参数替换到文本中这种实现通常称为宏 或定义宏 #define name( parament-list ) stuff 其中的 parament - list 是一个由逗号隔开的符号表它们可能出现在 stuff 中。 注意参数列表的 左括号必须与name紧邻 。 如果两者之间有任何空白存在参数列表就会被解释为 stuff 的一部分。 #define SQUARE(X) X*X//err
SQUARE(51)---51*51
//正确写法
#define SQUARE(X) ((X)*(X))注意 1. 宏参数和 #define 定义中可以出现其他 #define 定义的符号优先替换。但是对于宏不能出现递归。 2. 当预处理器搜索 #define 定义的符号的时候字符串常量的内容并不被搜索 #define SQUARE(X) ((X)*(X))
#define X 2//正确
#和##
#
当我们想实现下面这串代码时 int a 10;printf(the value of a is %d\n, a);int b 20;printf(the value of b is %d\n, b);float f 3.5f;printf(the value of f is %f\n, f);
有没有什么更简介的办法呢
我们知道c语言可以对字符串进行拼接比如
printf(hello world);
//输出helloworld省略了中间的空格。
修改后
#define PRINT(val,format) printf(the value of #val is format \n,val)
int a 10;
PRINT(a, %d);int b 20;
PRINT(b, %d);float f 3.5f;
PRINT(f, %f);
这里的#val相当于先对val完成替换再使之成为一个字符串(a)
## ## 可以把位于它两边的符号合成一个符号。 它允许宏定义从分离的文本片段创建标识符 宏参数的副作用 如果宏的参数在宏的定义中出现超过一次的话如果参数带有副作用将会导致不可预测的结果。 #define MAX(x,y) ((x)(y)?(x):(y))int main()
{int a 3;int b 4;int m MAX(a, b);int m ((a) (b) ? (a) : (b));printf(m %d a%d b%d\n, m, a, b);return 0;
} 输出结果为646
宏和函数对比
优点 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。 所以宏比函数在程序的规模和速度方面更胜一筹。 更为重要的是函数的参数必须声明为特定的类型。 所以函数只能在类型合适的表达式上使用。反之这个宏怎可以适用于整形、长整型、浮点型等可以 用于 来比较的类型。 #define MALLOC(type,num) (type)malloc(sizeof(type)*num)int* p MALLOC(int*,4);//define实现自定义封装
缺点 1.宏不能调试。 2.宏可能会带来运算符优先级问题。 3.宏由于类型无关可能会导致程序不严谨。 4.如果宏定义的代码量过大可能会大幅增加程序的长度。 #undef 作用移去#define定义的对象 命令行定义 此方法适用于linux操作系统用命令的方式在程序编译的时候对未定义的变量进行定义的一种方式。 #include stdio.h
int main()
{int array [ARRAY_SIZE];int i 0;for(i 0; i ARRAY_SIZE; i ){array[i] i;}for(i 0; i ARRAY_SIZE; i ){printf(%d ,array[i]);}printf(\n );return 0;
} 命令行gcc test.c -D ARRAY_SIZE10 条件编译 在编译一个程序的时候我们如果要将一条语句一组语句编译或者放弃是很方便的。因为我们有条件 编译指令 常见的条件编译语句
#if 常量表达式//...
#endif
2.多个分支的条件编译
#if 常量表达式//...
#elif 常量表达式//...
#else//...
#endif
3.判断是否被定义
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol
4.嵌套指令
#if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif
#elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif
#endif 与if..else很相似不同的是条件编译会把不满足条件的代码在预处理阶段直接删除掉。
头文件包含
本地文件包含
#include filename
库文件包含
#include stdio.h
嵌套包含 comm.h 和 comm.c 是公共模块。 test1.h 和 test1.c 使用了公共模块。 test2.h 和 test2.c 使用了公共模块。 test.h 和 test.c 使用了 test1 模块和 test2 模块。 这样最终程序中就会出现两份 comm.h 的内容。这样就造成了文件内容的重复 解决方案 开头写 #prama once或者 #ifndef __TEST_H__
#define __TEST_H__
//头文件的内容
#endif