c中宏定义的特殊符号
在C/C++中,宏定义是由define完成的,define中有三个特殊的符号值得我们注意:
1. #:在宏展开的时候会将#后面的参数替换成字符串,如:
#define p(exp) printf(#exp);
调用p(asdfsadf)的时候会将#exp换成"asdfsadf"
2. ##:将前后两个的单词拼接在一起。例如《The C Programming Language》中的例子:
#define cat(x,y) x##y
调用cat(var, 123)展开后成为var123.
3. #@:将值序列变为一个字符
#define ch(c) #@c
调用ch(a)展开后成为'a'.
自己写了一小段测试程序:
#define A(a,b) a##b
#define B(a) #a
#define C(a) #@a
#include <iostream>
using namespace std;
void main()
{
int v = 0,v1 = 1,v12 = 2;//v stands for var
cout << A(v1,2) << endl;
cout << B(v1) << endl;
cout << C(v) << endl;
}
结果为:
1
v1
v
在c++面对对象化编程还可以这样用:
#define A
public://此处加一些成员,并且可以在成员名上用##下一些功夫
class Object
{
A
};
以前没有太在意宏的这些语法,感觉宏这种拼接语法这样的功能很神奇。c++很自由,很强大。。。
c中宏定义的特殊符号相关推荐
- 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节
C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...
- C/C++编程笔记:浅析 C 语言中宏定义的使用,知识点全解
宏定义是用一个标识符来表示一个字符串,在宏调用中将用该字符串代替宏名.给程序员提供了便利,使程序更加清晰,便于阅读和理解,进一步提高了程序的运行效率,对于嵌入式系统而言,为了能达到性能要求,宏是一种很 ...
- verilog 定义位宽为1的_Verilog中宏定义位宽带来的问题
Verilog 中宏定义位宽带来的问题 宏定义在 C 语言程序中的使用司空见惯,他的好处就在于可以大大提高代码的可读性和可 移植性.而在 verilog 中,也支持这个语法,在很多开源代码中也都能看到 ...
- libev中ev_loop结构体中宏定义的理解
libev源代码由于有各种宏定义,十分让人费解,作者这么写确实使得代码很简练,但也给读者的阅读带来了巨大的麻烦,下面将分析下ev_loop这个结构体的定义,加深对作者代码简化的理解,先上代码: str ...
- c语言中宏定义的字符替换#define M(x,y,z) x*y+z
C语言中宏定义的字符替换问题 例子: 在c语言中定义如下宏 #define M(x,y,z) x*y+z 给定如下程序 #include<stdio.h> #include<stdl ...
- java中宏定义,宏定义的使用
C中的宏分为两类,对象宏(object-like macro)和函数宏(function-like macro). 预定义宏: 1.预定义宏的行为是由编译器指定的. 2.前后双下杠的一般都是预定义. ...
- C语言中宏定义的使用
1. 引言 1.1 宏定义的基本语法 1.2 宏定义的优点 1.3 宏定义的缺点 1.4 宏还是函数 2 使用宏时的注意点 2.1 算符优先级问题 2.2 分号吞噬问题 2.3 宏参数重复调用 2.4 ...
- ST17H26 SDK中宏定义注意事项
宏定义使用很方便,但 "##" 在宏中使用时可能导致宏定义在si工程中无法跟踪,切记! 如下: #pragma once /* Enable C linkage for C++ C ...
- C#中宏定义#define、预处理#if #else #endif的使用
C#中预处理的使用: 预处理指令并不会被编译为执行代码中的指令,但使用预处理指令可以选择编译程序中的哪部分代码.一般在调试代码时或在发布不同功能等级的软件版本中使用. 需要特别注意的是,宏定义必须在C ...
最新文章
- web项目启动时 初始化加载系统参数 获取无法自动注入的服务
- sql语句Order by 报错列名不明确
- python开发之路---第二章之--函数之匿名函数
- Dying In The Sun
- 字节数组java加密与解密
- U盘量产工具相关知识2
- 学习笔记(01):Linux操作系统入门培训_Linux/Unix基础培训教程视频课程-01.Linux入门培训之_软硬件平台介绍...
- 作为一位爬虫,说说代理IP哪家强?
- 浪潮之巅·IT从业者或投资人必读书籍
- bzoj 4816 [Sdoi2017]数字表格——反演
- 好听的敕勒川天苍苍野茫茫风吹草低见牛羊
- 【Paper】ConvLSTM:Convolutional LSTM Network: A Machine Learning Approach for Precipitation Nowcasting
- CocoaPods制作第三方库,管理自己的私有库以及发布官方库(模块化与组件化)
- 深度解读 | VR中的See-Through技术
- U盘安装WIN10时显示 windows无法安装到这个磁盘 选中的磁盘采用GPT分区形式
- matlab与化学,MATLAB与化学
- 一个简易版的spice VDI 云桌面 客户端 系统
- TAOCP作者的高德纳--------有神有关的故事
- 生成对抗网络(GAN)研究年度进展评述 2017
- Python中进行Excle操作
热门文章
- 低门槛,多玩法打金游戏 Tiny World
- 腹肌和皮肤应该怎么画?女生腹部马甲线画法
- 电子元器件行业SCM供应链平台降低管理成本,提升供应链系统效率
- 输入字符串判断有多少个字母,数字和其他
- Flowable工作流之核心流程操作的本质
- Java如何爬虫奥运奖牌榜数据,恭喜中国获得东京奥运会首金!
- 荣耀最强拍照手机诞生:荣耀20系列塑造的“潮流科技宇宙”
- 用诺模图可视化你的模型
- 汽车租赁系统(2)-完成登录功能
- ios调用restful接口_Office 365 iOS SDK-如何调用SharePoint REST API