宏定义

C/C++ #define 宏定义

匿名 (未验证) 提交于 2019-12-03 00:15:02
#define命令是C语言中的一个宏定义命令,它用来将 一个标识符 定义为 一个字符串 ,该标识符被称为 宏名 ,被定义的字符串称为 替换文本 。 定义宏的作用一般是用一个 短 的名字代表一个 长 的字符串。 一般形式为: 1)#define 标识符 字符串 这就是已经介绍过的 定义符号常量 。 如:#define PI 3.1415926 2)还可以用#define命令定义 带参数 的宏定义。其定义的一般形式为: 使用的形式如下: 代替 由于C++增加了 内置函数(inline) ,比用带参数的宏定义更方便,因此在C++中基本上已 不再用#define命令定义宏 了,主要用于 条件编译 中。 参考链接: https://blog.csdn.net/zhouqt/article/details/82718409 https://www.jb51.net/article/105807.htm http://c.biancheng.net/cpp/biancheng/view/147.html https://www.linuxidc.com/Linux/2017-02/140697.htm https://www.cnblogs.com/zijintime/p/7510125.html 来源:博客园 作者: GuoXinxin 链接:https://www.cnblogs.com

#undef取消宏定义

匿名 (未验证) 提交于 2019-12-02 23:57:01
  如果你想定义这个宏那就#define X   如果你不想让你已经#define X的宏在其他地方由于引入这个包含宏定义的.h文件而引起一些编译问题,那你就#undef X掉,就这么简单。   举个简单的例子:   有1.c,11.h,12.h三个文件,其中在11.h中定义了#define X extern   x int a;   而在12.h中你又定义了#define X int   x b;   而在1.c中同时包含了这2个头文件,那就会引起一些问题,此时你必须把其中一个#undef掉来确保宏的正常。   #include <stdio.h>   int main(void)   {   #define MAX 200    printf("MAX = %d\n",MAX);   #undef MAX   #define MAX 300    printf("MAX = %d\n",MAX);    return 0;   }    来源:博客园 作者: 蓟_可爱的叔 链接:https://www.cnblogs.com/wjq13752525588/p/11453515.html

C语言的宏macro的使用

匿名 (未验证) 提交于 2019-12-02 23:55:01
C's Macro Introduction 1.The Connect Macros: ## 这是一个预处理连接符,这个操作符主要用来将两个符号连接成为一个完整的宏符号。通过下面的代码,可以看到其具体的使用方法: 如下例子: #include <stdio.h> struct macro { int N; char M; }; struct macro macro_drv = {100,20}; #define XNAME(n) x##n #define Macro(x) x##_drv.N int main(void) { char *XNAME(3) = "Hello,Macro(##)\n"; printf("%s",XNAME(3)); printf("The struct:%d\n",Macro(macro)); return 0; } 运行结果如下所示: 2.The Variadic Macros: ... and __VA_ARGS__ 在某些函数当中,需要接收变化数量的参数,例如基本的printf函数。 我们可以通过将函数的 最后一个参数 定义为宏 ... ,这样函数就可以使用预定义的宏 __VA_ARGS__ 来表示变化数量的变量了。 如下例子: #include <stdio.h> #define PR(x,...) printf("Message" #x "

C++通过宏定义判断操作系统及编译器

匿名 (未验证) 提交于 2019-12-02 23:52:01
INTRODUCTION: C++的编译环境千奇百怪,很多时候一些代码在某些编译环境下可用,一旦移到其他环境下,就会干脆Compile Error 对此,我们可以使用C++的宏定义来判断操作系统,从而进行一些有趣的操作( 貌似意义不大 ) 比如这样 1 #include<iostream> 2 #if !defined(_WIN32)//如果我使用的不是WIN32操作系统 3 #include<bits/stdc++.h>//那我就打开万能头文件 4 #endif //if要和endif搭配使用 5 using namespace std; 6 int main() 7 { 8 cout << "hello world" << endl; 9 return 0; 10 } 对于上面这段代码,vs不允许使用万能头,所以就让他自己去判断一下编译环境是不是Windows,如果不是Windows,而是OJ什么的,那就打开万能头文件 也就是说 我们可以通过 #if defined( XXXX ) 或者 #ifdef XXXX这样的语句来判断当前的操作系统,根据操作系统的不同进行不同操作 而且有趣的是,只要#if与#endif之间的操作在当前编译器下不被执行,不管写什么乱七八糟的东西都不会Compile Error 借助这个操作,我们甚至可以写两个main()函数 1 #include

ios 日常开发常用宏定义

匿名 (未验证) 提交于 2019-12-02 23:47:01
#define kFONT_SIZE(f) [UIFont systemFontOfSize:(f)] #define kFONT_BOLD_SIZE(f) [UIFont boldSystemFontOfSize:(f)] #define kFONT_ITALIC_SIZE(f) [UIFont italicSystemFontOfSize:(f)] #define kRGBCOLOR(r,g,b) [UIColor colorWithRed:(r)/255.f green:(g)/255.f blue:(b)/255.f alpha:1.f] #define kRGBACOLOR(r,g,b,a) [UIColor colorWithRed:(r)/255.f green:(g)/255.f blue:(b)/255.f alpha:(a)] #define kRandomColor [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0] #define kColorWithHex(rgbValue) [UIColor colorWithRed:((float)(

宏定义:#define

匿名 (未验证) 提交于 2019-12-02 23:26:52
版权声明:版权归作者所有 https://blog.csdn.net/qq_36772866/article/details/88833260 在C语言中可以用#define定义一个标识符来表示一个常量。其特点是:定义的标志符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。预编译又叫预处理。预编译不是编译,而是编译前的处理,这个操作是在正式编译之前由系统自动完成的,所以叫预编译。用#define 定义标识符的一般形式为: #define 标识符 常量 #define 和 #include一样,也是以“#”开头的。凡是以“#”开头的均匀为预处理指令,所以#define也是一条预处理指令。#define 又称宏定义,标识符为所定义的宏名,简称宏。 标识符的命名规则与前面讲的变量的命名规则一样。#define的功能是标识符定义为其后的常量。一经定义,程序就可以直接使用标识符来表示这个常量。是不是与定义变量类似? 但是要区分开来,变量名表示的是一个变量,但是宏名表示的是一个常量。 变量可以给他赋值,但是常量当然就不能给他赋值了! 宏所表示的常量可以是数字,字符,字符串,表达式,其中最常用的是数字。 那么为什么要使用宏定义? 用宏定义有什么好处? 我们直接使用数字不行? 为什么要用一个标识符表示数字? 宏定义的最大好处就是 “方便程序的修改”。 使用宏定义可以使用宏代替一个程序中

简介make命令和makefile文件

匿名 (未验证) 提交于 2019-12-02 21:53:52
一、为什么要用到 make 命令和 makefile 文件   在 Linux 下编写一个程序,每次编译都需要在命令行一行一行的敲命令。如果是一个很小的程序还好说,命令不怎的复杂,编译速度也挺快,但是对于大型程序来说,这样无疑很麻烦,且不说可能会敲错命令,有时候仅仅改动了一个小地方,却需要将整个程序全部重新编译一遍,显然很浪费时间。Linux 提供了 make 命令来解决上述问题,它会 在必要时重新编译所有受改动影响的源文件 。同时,还提供了一个 makefile 文件,它告诉 make 命令如何构建应用程序。这里用一个简单的例子提前演示一下: /* hello.c */#include <unistd.h> #include <stdio.h> #include <stdlib.h> int main () { printf ( "hello world!\n" ); exit ( 0 ); } /* Makefile */ hello : hello . c gcc - o hello . s - S hello . c gcc - o hello . o - c hello . s gcc - o hello hello . o clean : - rm hello hello . s hello . o   这里提供了两段代码,第一段代码是一个简单的 HelloWorld

第3课.进化后的const

不羁的心 提交于 2019-12-02 15:41:40
1.c语言中 const修饰的变量是只读的,本质上还是变量 const修饰的局部变量在栈上分配空间(因为在栈上分配空间,所以我们可以通过改变这个空间的值。间接去改变这个变量。) const修饰的全局变量在只读存储区分配变量(这个区不能改) const在编译期有用,在运行期无用(const修饰的变量只在编译期有只读属性,过了编译期的运行期就无效了) const修饰的变量不是真的变量,它只是告诉编译器该变量不能出现在赋值号的左边。 思考:c语言中怎么定义真正的常量? 只有enum(注:define不能,它是宏定义不是常量定义,下面会讲到) eg:const变量被修改 2.c++中 const的声明是在符号表中放入常量,编译过程中发现使用该常量是则直接以符号表中的值替换,编译过程中若发现以下情况则给对应的常量分配存储空间。(这里分配空间只是为了更好的兼容c语言,实际上并没有什么用) a.对const常量使用了extern b.对const常量使用了& 注:c++编译器虽然可能为const常量分配空间,但不会使用其存储空间的值。 3.c++中const常量与宏定义的区别 const常量是由编译器处理,编译器对const常量进行类型检查和作用域检查 宏定义有预处理处理,单纯的文本替换 注:const定义的变量不能使用在数组,case之类的地方(因为const不是常量) 来源: https:/

灵活对调试信息宏定义开关和printf使用方法

霸气de小男生 提交于 2019-12-02 15:07:09
我们在写程序的时候,总是或多或少会加入一些printf之类的语句用于输出调试信息,但是printf语句有个很不方便的地方就是当我们需要发布程序的时候要一条一条的把这些语句删除,而一旦需要再次调试的时候,这些语句又不得不一条条的加上,这给我们带来了很大的不便,浪费了我们很多的时间,也造成了调试的效率低下。所以,很多人会选择使用宏定义的方式来输出调试语句。 比如,定义一个宏开关: #define __DEBUG 当需要调试的时候,使用语句: #ifdef __DEBUG printf(xxx); #endif 这种方式的调试,可以通过undef __DEBUG的方式让告知编译器不编译这些语句,从而不再输出这些语句。但是这种方式的麻烦之处也是显而易见的,每一条调试语句都需要使用两条宏定义来包围,这不但在代码的编写上不便,源码结构也不好看,工作量依然不小。 如果我们能够把这三条语句编程一条,那该多舒服呀~,于是,我们想到使用这样的语句: #ifdef __DEBUG #define DEBUG(info) printf(info) #else #define DEBUG(info) #endif 这样,我们在编写代码的时候,使用DEBUG一条语句就可以了,我们把宏开关__DEBUG打开,所有的DEBUG(info)宏定义信息都会被替换为printf(info),关上则会被替换成空

C语言预处理理论-宏定义1

大憨熊 提交于 2019-12-02 08:10:37
宏定义1 宏定义的规则和使用解析 (1)宏定义的解析规则就是:在预处理阶段由预处理器进行替换,这个替换是原封不动的替换。 (2)宏定义替换会递归进行,直到替换出来的值本身不再是一个宏为止。 #define M 10 #define N M (3)一个正确的宏定义式子本身分为3部分,第一部分是#define,第二部分是宏名,剩下的所有为第三部分。 (4)宏可以带参数,称为带参宏。带参宏的使用和带参函数非常像,但是使用上有一些差异。在定义带参宏时,每一个参数 在宏体中引用时都必须加括号,最后整体再加括号,括号缺一不可。 #define X(a,b) ((a)*(b)) 2、宏定义实例1:MAX宏,求2个数中较大的一个 #define MAX(a,b) ((a)>(b) ? (a) : (b)) 关键: 第一点:要想到使用三目运算符来完成。 第二点:注意括号的使用 3、宏定义实例2:SEC_PER_YEAR,用宏定义表示一年中有多少秒 #define SEC_PER_YEAR (31536000) //可行,但是不推荐 #define SEC_PER_YEAR (365*24*60*60) //错误,默认int类型,超过类型存储范围了,int本身是有符号的 #define SEC_PER_YEAR (365*24*60*60UL) //正确写法,将有符号变成无符号,范围扩大一倍 来源: