宏定义21.带参宏和带参函数的区别(1)宏定义是在预处理期间处理的,而函数是在编译期间处理的.这个区别带来的实质差异是:宏定义最终是在调用宏的地方把宏体原地展开,而函数是在调用函数处跳转到函数中去执行,执行完后再跳转回来.注:宏定义和函数最大差别就是:宏定义是原地展开,因此没有调用开销:而函数是跳转执行再返回,因此函数有比较大的调用开销.所以宏定义和函数相比,优势就是没有调用开销,没有传参开销,所以当函数体很短(尤其是只有一句话)可以用宏定义来替代,这样效率高.(2)带参宏和带参函数的一个重要差…
宏定义1宏定义的规则和使用解析(1)宏定义的解析规则就是:在预处理阶段由预处理器进行替换,这个替换是原封不动的替换.(2)宏定义替换会递归进行,直到替换出来的值本身不再是一个宏为止.#define M 10#define N M(3)一个正确的宏定义式子本身分为3部分,第一部分是#define,第二部分是宏名,剩下的所有为第三部分.(4)宏可以带参数,称为带参宏.带参宏的使用和带参函数非常像,但是使用上有一些差异.在定义带参宏时,每一个参数在宏体中引用时都必须加括号,最后整体再加括号,括号缺一不…
//#define 宏定义(宏定义一般大写) //知识点一-->#define的作用域:从#define开始,从上往下,如果遇到#undef就到#undef处结束,如果没有就是作用于当前整个文件 #include<stdio.h> #include<stdlib.h> //知识点二-->宏定义作用 //宏定义作用1:起到替换作用,可以定义常量 #define X 10 //宏定义作用2:替换代码的任意部分(一般用于易语言,或者加密代码) #define 水乃万物之源 m…
#define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,使得程序的运行与预期的目的不一致,或者在读别人写的程序时,把运行结果理解错误,这对 C语言的学习很不利.1 #define命令剖析1.1   #define的概念#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本.…
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)枚举 1)枚举类型的定义 枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数. 一般形式为:enum 枚举名 {枚举元素1,枚举元素2,……}; 2)枚举变量的定义 ①先定义枚举类型,再定义枚举变量 ②定义枚举类型时同时定义枚举变量 ③省去枚举名称,直接定义枚举变量 enum Sex { Man, Woman, Unkown};2 enum S…
一.宏定义#define 优点:一方面可以节省程序的空间上的篇幅,另外,恰当地使用宏定义可提高程序的时间效率.代码可以写的通俗易懂.可以提高程序的清晰性.可读性,使于修改移植等. 缺点:宏定义的使用实际上也存在副作用,大量的使用会破坏程序的可读性,并给程序的调试带来麻烦,是优点也是缺点.过多的宏定义,代码不容易调试,代码进不去宏定义当前所运行的内容. 一般来说,如果一个函数非常大,一般不宜采用宏定义来进行改造,仅仅是那些小的函数,而且非常影响效率的函数才值得这样去做. 1. 不带参宏定义 例如:…
一.宏定义:# define 1.为什么要使用宏? 因为调用宏比调用函数更有效率,函数的调用必须要将程序的执行顺序转移到函数所存放的内存地址中,将函数程序内容执行完后,再返回到执行该函数前的地方,这种转移操作要求执行前要保存现场并记忆执行地址,转回后要恢复现场,并按原来保存的地址继续执行,因此,函数调用有一定的时间和空间的开销,而宏只是在预处理的地方把代码展开,不需要额外的时间和空间开销,所以调用一个宏比调用一个函数更有效率 2.宏定义的最大好处: 宏定义的使用上像一个函数,但不是函数,它使用预…
宏定义#define pStr char*  ,是直接把程序中出现pStr的地方替换成char* ,直接替换: typedef  char * pStr; 是给char*定义一个别名叫做 pStr; 题目一 通常讲,typedef要比#define要好,特别是在有指针的场合.请看例子: typedef char *pStr1; #define pStr2 char *; pStr1 s1, s2; pStr2 s3, s4;在上述的变量定义中,s1.s2.s3都被定义为char *,而s4则定义…
1. C 语言中的宏定义 (1)#define 是预处理器处理的单元实体之一(因此,预处理器只是简单的进行替换,并不(2)#define 定义的宏可以出现在程序的任意位置(包括函数体的内部)(3)#define 定义之后的代码都可以使用这个宏 2. 定义宏常量 (1)#define 定义的宏常量可以直接使用(2)#define 定义的宏常量本质为字面量 3. 宏定义表达式 (1)#define 表达式的使用类似函数调用(2)#define 表达式可以比函数更强大(3)#define 表达式比函数…
define的定义方式 无参一般形式:#define 标认符 字符串                     比如:#define COUTD "%d\n" 带参一般形式:#define 宏名(形参表) 字符串             比如:#define M2(a,b) ((a>b)?a:b) #include <stdio.h> /*宏定义的注意事项(1)不建议过多的使用宏定义来处理运算,原因是运算符表达式的优先级很容易被搞混,代码优化困难*/ /*预处理在win…
1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认识这个宏了:也可以把任何东西定义成宏.因为编译器会在预编译的时候用真身替换替身,而在我们的代码里面却又用常常用替身来帮忙. 看例子: #define PI 3.141592654 在此后的代码中你尽可以使用PI 来代替3.141592654,而且你最好就这么做.不然的话,如果我要把PI 的精度再提高…
1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认识这个宏了:也可以把任何东西定义成宏.因为编译器会在预编译的时候用真身替换替身,而在我们的代码里面却又用常常用替身来帮忙. 看例子: 1 #define PI 3.141592654 在此后的代码中你尽可以使用PI 来代替3.141592654,而且你最好就这么做.不然的话,如果我要把PI 的精度再…
原文地址:http://www.cnblogs.com/haore147/p/3646934.html 1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认识这个宏了:也可以把任何东西定义成宏.因为编译器会在预编译的时候用真身替换替身,而在我们的代码里面却又用常常用替身来帮忙. 看例子: 1 #define PI 3.141592654 在此后的代码…
一.预处理 预处理 gcc -E Hello.c -o hello.i 编译 gcc -S hello.i -o hello.s 汇编 gcc -c hello.s -o hello.o 链接 gcc hello.o -o hello Makefile # "hello.c" # "<built-in>" # "<command-line>" # # # "hello.c" # # # # # # #…
一.由源码到可执行程序的过程 1. 预处理: 源码经过预处理器的预处理变成预处理过的.i中间文件   1 gcc -E test.c -o test.i 2. 编译: 中间文件经过编译器编译形成.s的汇编文件   1 gcc -S test.i -o test.s 3. 汇编: 汇编文件经过汇编器生成目标文件.o(机器语言)   1 gcc -c test.s -o test.o 4. 链接: 链接器将目标文件链接成.exe可执行程序(Linux下是.elf)   1 gcc test.o -o…
一.由源码到可执行程序的过程 1. 预处理: 源码经过预处理器的预处理变成预处理过的.i中间文件 1 gcc -E test.c -o test.i 2. 编译: 中间文件经过编译器编译形成.s的汇编文件 1 gcc -S test.i -o test.s 3. 汇编: 汇编文件经过汇编器生成目标文件.o(机器语言) 1 gcc -c test.s -o test.o 4. 链接: 链接器将目标文件链接成.exe可执行程序(Linux下是.elf) 1 gcc test.o -o test.ex…
目录(?)[-] 简单宏定义 带参数的宏 运算符 运算符 宏的通用属性 宏定义中圆括号 创建较长的宏 较长的宏中的逗号运算符 宏定义中的do-while循环do 空操作的定义 预定义宏 C语言中常用的宏 1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define  标识符 替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和标点符号.当预处理器遇到一个宏定义时,会做一个 “标识符”代表“替换列表”的记录.在文件后面的…
概念 以“#”号开头的都是预处理命令 例如 #include <stdio.h>宏定义 宏定义无参数的宏名后不带参数# 表示这是一条预处理命令, define 为宏定义命令.“标识符”为所定义的宏名.“字符串”可以是常数,表达式.格式串等 举例: #define PI 3.1415926 作用: 就是用指定标识符PI来代替数3.1415926 对源程序作编译时, 将先由预处理程序进行宏代换, 即用3.1415926表达式去置换所有的宏名PI, 然后编译 #include <stdio.h…
预处理:也就是包括须要的头文件,用#include<标准头文件>或#include "自己定义的头文件" 宏定义,如:#define PI 3.1415926 查看用宏定义的值替换宏名称,如:gcc -E test.c 带參数的宏:MAX(x,y) (x)>(y)? ((x):(y))   //用法与函数一样 宏运算:     #define PRINT(n) printf(#n"=%d",n)   //#n 就是把传入的变量值作为字符串放在那里…
#include <stdio.h> //定义不带参数的宏 #define PI 3.14 /******************************************************** * 定义带参数的宏,#define和Pow(a)之间有个空格,Pow和(a)之间不能存在空格 * Pow(a)和 ( (a) * (a) )之间有一个空格,参数应该用括号括住,结果也应该用 * 括号括住,因为编译前,预处理只是对宏进行替换,真正执行时有可能会因为参数的形式出 * 现不可预知…
01: 防止一个头文件被重复包含 #ifndef COMDEF_H#define COMDEF_H//头文件内容#endif 02: 重新定义一些类型防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植. typedef  unsigned char      boolean;     /* Boolean value type. */typedef  unsigned long int  uint32;      /* Unsigned 32 bit value */typedef…
写好C 语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等.下面列举一些成熟软件中常用得宏定义. 1.防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2.重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植. typedef unsigned char boolean; /* Boolean value type. */ typedef unsigned lo…
这个条目叫做,尽量使用编译器而不要使用预处理器更好.#define并没有当作语言本身的一部分. 例如下面的例子: #define ASPECT_RATIO 1.653 符号名称永远不会被编译器看到.它可能在源码到达编译器之前被预处理器移除.ASPECT_RATIO 最终不会进入符号表,如果因为这个常量的使用而导致编译错误,会使你非常迷惑,因为错误信息会指向1.653而不是ASPECT_RATIO.如果ASPECT_RATIO被定义在一个不是你自己写的头文件中,你会不知道1.,653来自哪里.,…
C++中有两种定义常量的方式:#define预处理和const关键字 #define 预处理指令 #include <iostream> using namespace std; #define LENGTH 10 #define WIDTH 5 #define NEWLINE '\n' int main() { int area; area = LENGTH * WIDTH; cout << area; cout << NEWLINE; ; } const 前缀声明指…
C++面试常见问题--------01预编译和宏的使用 C++预处理器 预处理器是一些指令,它将指示编译器在实际编译之前需要完成的预处理.预处理必须要在对程序进行词法与语义分析.代码生成与优化等通常的编译过程之前进行,经过预处理的程序不再包含之前的预处理命令. 所有的预处理器指令都以#号开始,并且前面不可以出现除了空白字符以外的字符.预处理器指令不是C++指令,所以不需要以 :结尾.所有的C++程序实例都有预处理器指令 #include,这个宏用于把头文件包含在源文件中. 预处理器指令是C++统…
最基本的宏定义用法 #define aaa bbb 表示用aaa替换bbb的内容. 宏作用范围 宏的作用范围是在当前文件内, 如果需要作用于其他类(如在类b调用类a已定义宏),那么需要在类b引入类a的头文件(a.h). 如果需要作用于整个工程,可以定义一个类如Config.h,在该类定义好需要的宏,然后在工程的XXX_Prefix.pch文件 #import "Config.h" 在Config.h中 #define aaa bbb 在XXX_Prefix.pch文件 中 #ifdef…
在C++的宏定义中,符号##一般是用于连接,包括参数的连接,参数与标识符的连接等,然后形成一个新的标识符. 下面举几个例子来进行说明. eg1: #define ADD(a,b) a##b #define ab "123456" int main() { string str=ADD(a,b); //ADD(a,b)结果为ab,此时str=ab std::cout<<str<<std::endl; // #define ab "123456"…
#define Bin(n) LongToBin(0x##n##L) " ## ",属于宏定义中的字符(串)连接符,即,将符号两端的字符(串)接为一个整体,如以上代码中,在调用Bin(n)时,若n=1111 1111,该宏的作用是将1111 1111视为字符串,替换"0x##n##L"中的"n",并与"0x"和"L"连接为一体,即Bin(1111 1111)等价于调用LongToBin(0x 1111 11…
2的32次方为2147483648*2,0~(2147483648*2-1)这是32位机上无符号整数代表的范围.而32机的int范围为-2147483648~+2147483647 stackoverflow.com上有人提出这样一个问题: > ) std::cout << "true"; else std::cout << "false"; 这将输出true,而下面的程序会输出false: ) > ) std::cout <…
1 宏定义在预编译的时候进行字符串替换.内联函数在编译的时候进行函数展开. 2 宏定义没有类型检查.内联函数会进行参数列表.返回值等类型检查.…