#define命令的一些高级用法
- #define Conn(x,y) x##y
- #define ToChar(x) #@x
- #define ToString(x) #x
- int n = Conn(123,456); /* 结果就是n=123456;*/
- char* str = Conn("asdf", "adf"); /*结果就是 str = "asdfadf";*/
做个越界试验char a = ToChar(123);结果就错了;
但是如果你的参数超过四个字符,编译器就给给你报错了!
1 防止一个头文件被重复包含
- #ifndef BODYDEF_H
- #define BODYDEF_H
- //头文件内容
- #endif
- #define MEM_B( x ) ( *( (byte *) (x) ) )
- #define MEM_W( x ) ( *( (word *) (x) ) )
- #include <iostream>
- #include <windows.h>
- #define MEM_B(x) (*((byte*)(x)))
- #define MEM_W(x) (*((WORD*)(x)))
- int main()
- {
- int bTest = 0x123456;
- byte m = MEM_B((&bTest));/*m=0x56*/
- int n = MEM_W((&bTest));/*n=0x3456*/
- return 0;
- }
- #define OFFSETOF( type, field ) ( (size_t) &(( type *) 0)-> field )
- #define FSIZ( type, field ) sizeof( ((type *) 0)->field )
- #define B_PTR( var ) ( (byte *) (void *) &(var) )
- #define W_PTR( var ) ( (word *) (void *) &(var) )
- #define UPCASE( c ) ( ((c) >= ''a'' && (c) <= ''z'') ? ((c) - 0x20) : (c) )
- #define DECCHK( c ) ((c) >= ''0'' && (c) <= ''9'')
- #define HEXCHK( c ) ( ((c) >= ''0'' && (c) <= ''9'') ||((c) >= ''A'' && (c) <= ''F'') ||((c) >= ''a'' && (c) <= ''f'') )
- #define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))
- #define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
#define __DEBUG
#ifdef __DEBUG
printf("%s", ...);
#endif
另外,ANSI C标准中有几个标准预定义宏,前面几个常用于printf(sprintf)等语句中:
__LINE__:在源代码中插入当前源代码行号;
__FILE__:在源文件中插入当前源文件名;
__DATE__:在源文件中插入当前的编译日期
__TIME__:在源文件中插入当前编译时间;
__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
__cplusplus:当编写C++程序时该标识符被定义。
其中__cplusplus常用于头文件中,格式如下:
#ifndef _ZX_FUNC_H
#define _ZX_FUNC_H #ifdef __cplusplus
extern "C" {
#endif /* functions */
char *strdup (const char *s); #ifdef __cplusplus
}
#endif #endif
extern"C"表示将其中的代码按照C编译方法编译,目的是实现C++与C语言的调用。
C编译与C++编译的区别是:C会将上面strdup编译成_STRDUP符号,而C++会编译成_STRDUP_CHAR,这也是C++为什么能实现函数重载的原因。extern只能出现在C++文件中,一般如上面的方式置于头文件中。
要在C中调用C++代码,需要在C代码中的函数或变量声明为extern类型,在C++中将函数或变量用extern "C"修饰。
12 简单数学计算(绝对值,三角函数等)
#define ABS( a ) ( ((a)>0) ? (a) : (-(a)) )
13 #define 一个复杂语句
比如交换a,b的值,
#define(a,b) do { \
int t = 0;
t = a; \
a = b; \
b = t; \
} while(0)
注:#define的这些高级用法在Linux源代码很多处出现,可阅读参考Linux源代码。
#define命令的一些高级用法的更多相关文章
- nmap命令-----高级用法
探测主机存活常用方式 (1)-sP :进行ping扫描 打印出对ping扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测): 下面去扫描10.0.3.0/24这个网段的的主机 nmap ...
- linux中find命令高级用法
前言 在<Linux中的文件查找技巧>一文中,我们已经知道了文件查找的基本方法,今天我们介绍find命令的一些高级使用技巧.它能满足我们一些更加复杂的需求. 查找空文件或空目录 有时候需要 ...
- SQL server 存储过程 C#调用Windows CMD命令并返回输出结果 Mysql删除重复数据保留最小的id C# 取字符串中间文本 取字符串左边 取字符串右边 C# JSON格式数据高级用法
create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ...
- Linux tar命令高级用法——备份数据
Linux tar命令高级用法——备份数据 2015-12-31 Linux学习 Linux上有功能强大的tar命令,tar最初是为了制作磁带备份(tape archive)而设计的,它的作用是把文件 ...
- Linux下mv命令高级用法
mv 也是 Linux 下一个使用频率非常高的命令,但除了一些基本用法,你还知道它的哪些高级用法呢? 1. 基本用法 移动一个/多个文件: 移动一个/多个目录: 重命名文件/目录. 这些都是很基本的用 ...
- Linux下 ls 命令的高级用法8例
Linux下 ls 命令的高级用法8例 在Linux下,ls这个命令大家肯定太熟悉了,良许相信只要是Linux工程师,每天都会离不开这个命令,而且一天会使用个几百次.但是,除了 ls -l 以外,你还 ...
- 90.#define高级用法
define把参数变成字符串 #define f(x) printf("%s",#x); define连接两个字符串 #define a(x) a##x define把参数变成字符 ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- Go template高级用法、深入详解、手册、指南、剖析
入门示例 以下为test.html文件的内容,里面使用了一个template语法{{.}}. <!DOCTYPE html> <html> <head> <m ...
随机推荐
- 我们的空间是它圆——基于Poicare对宇宙的模型
一般 状态 在人类文明的开始,并探讨了空间和时间的混乱从来没有停止过.马跑得更快.鱼下潜深.鸟振翅高飞,但是,人类并没有很深的不满潜飞不高.为什么?其原因是,马跑得更快,但它不会不知道他们为什么会跑得 ...
- 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注
原文:[百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的标注 摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内 ...
- [Attila GPU] ATTILA GPU Streamer Unit (D3D Input Assambler) 结构分析
http://www.opengpu.org/forum.php?mod=viewthread&tid=40&highlight=Attila 查看: 7488|回复: 26 [ ...
- zoj 3822 Domination(dp)
题目链接:zoj 3822 Domination 题目大意:给定一个N∗M的棋盘,每次任选一个位置放置一枚棋子,直到每行每列上都至少有一枚棋子,问放置棋子个数的期望. 解题思路:大白书上概率那一张有一 ...
- C#实现Web文件上传的两种方法
1. C#实现Web文件的上传 在Web编程中,我们常需要把一些本地文件上传到Web服务器上,上传后,用户可以通过浏览器方便地浏览这些文件,应用十分广泛. 那么使用C#如何实现文件上传的功能呢?下面笔 ...
- 非常多人不愿意承认汉澳sinox已经超过windows
汉澳sinox採用的zfs和jail打造高可靠性存储server和矩阵计算机,这不是windows和linux能相提并论的. 只是非常多人立即出来出来反驳说,windows驱动程序多(就是支持硬件多) ...
- 一个简单的创建dom的函数
var regName = /^(div|a|p|ul|li|input|select|document|body|iframe)$/;function createDom(name, obj) { ...
- Maven学习笔记(一) : 简单介绍
近期在学习<maven实战>,写点东西记录一下.^_^ 何为Maven: Maven主要服务于基于java平台的项目构建.依赖管理和项目信息管理. Maven是优秀的构建工具: ...
- ExtJS4 自己定义基于配置的高级查询1
今天在编码过程中遇到一个问题,临时还没解决,先记录下来 上面是我做的高级查询面板..字段名和值都是读取配置文件,依据用户选择不同的字段名,自己主动载入不同的值列表,关系是与或 问题来了,我在字段名那个 ...
- Libgdx Box2D现实---这缓释微丸(两:Box2D介绍)
Box2D官方网站 : http://box2d.org/ Box2D v2.1.0用户手冊翻译 : http://blog.csdn.net/complex_ok/article/catego ...