#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 ...
随机推荐
- 收集的VS2013的使用小技巧( 不断总结中)
对于经常使用vs的朋友,如果能用键盘直接做的事,还是键盘更便捷点,现在我就把自己遇到的一些给写下来. 1.对一个函数的说明 先写一个函数,以及参数,完成后,在函数上输入///,vs会自动补全说明的信息 ...
- iOS--Swift开发中的单例设计模式
最近在开发一个小的应用,遇到了一些Objective-c上面常用的单例模式,但是swift上面还是有一定区别的,反复倒来倒去发现不能按常理(正常的oc to swift的方式)出牌,因此搜索了一些帖子 ...
- POI导出Excel文档通用工具方法
import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Map; imp ...
- HDU 1983 BFS&&DFS
大多数刚需封锁4区域可以,DFS地区封锁.BFS无论是通过 #include "stdio.h" #include "string.h" #include &q ...
- ASPX的Timer位置没放正确,导致整页刷新,而不是UpdatePanel里的内容刷新。
提示:Timer应该放在UpdatePanel的ContentTemplate标签里,才行.放在外面的话,会导致整页刷新.
- SQL 2005 中查询或执行另外的数据库操作的方法
原文:SQL 2005 中查询或执行另外的数据库操作的方法 摘要: 如果,你想在一台数据库服务器上,查询另一个台数据服务器的数据该如何做呢?如果,你想在同一台数据服务器上,在不同的数据库之间查询数据, ...
- DirectX (13) 粒子系统
笔者:i_dovelemon 资源:CSDN 日期:2014 / 10 / 16 主题:Point Sprite, Particle System 介绍 在游戏中.非常多的绚丽,灿烂的特效,都能够使用 ...
- Ubuntu Ruby On Rails安装和配置
在这篇文章中ubuntu通过rvm安装ruby和rails.步借鉴了官方网站和网上信息,这里给大家分享. 1. 安装mapapis公钥: gpg --keyserver hkp://keys.gnup ...
- [LeetCode] ZigZag Conversion [9]
称号 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows li ...
- ubuntu下的apache的虚拟主机的配置
ubuntu下的虚拟主机的配置相对window下的虚拟主机配置有些许不同. 对于要新建的虚拟主机,我们可以有如下几个步骤: 1.在/etc/apache2/sites-available/目录下新建一 ...