宏定义中的常见使用

/***
*yy_room
*2015-3-6
*
*
*/
#include <iostream>
#include <cstdio>

using namespace std;

/*
* # 表示将一个宏的参数转换为字符串字面量
* ## 将两边记号连接在一起
*
*/
#define MACRO_GET_SET(T,VarName,FuncName) protected: T VarName;         public:         T get##FuncName() {return VarName;}         void set##FuncName(T temp) {VarName = temp;}

/*
* __VA_ARGS__ 表示可变参数
* __LINR__  表示行号
* __FILE__  文件
* __FUNCTION__ 函数
*/
#define macro_print(format,...) printf(format   "LINE= %d  FILE = %s   FUNCTION = %s",##__VA_ARGS__,__LINE__,__FILE__,__FUNCTION__)

class Test
{
  MACRO_GET_SET(int,x,x)
};

int main()
{

    Test* test = new Test();
    test->setx(10);
    cout<<test->getx()<<endl;

    macro_print("%d  ,  %d,   %s  ",1,2,"1234");
    macro_print("dfdsfdfsd");
    return 0;
}
时间: 2024-10-09 17:57:06

宏定义中的常见使用的相关文章

宏定义中的#,##,...,do{}while(0),__VA_ARGS__

宏定义中的#,## 1.在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组 #define syslog(a) fprintf(stderr,"Warning: " #a"\n"); 2.简单的说,"## "是一种分隔连接方式,它的作用是先分隔,然后进行强制连接 举列 -- 试比较下述几个宏定义的区别 #define A1(name, type)  type name_##type##_type 或 #define A

宏定义中使用do{}while(0)的好处 (转载)

宏定义中使用do{}while(0)的好处   #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因: 1,空的宏定义避免warning: #define foo() do{}while(0) 2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现. 3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现: #define foo(x) /action1(); /action2(); 在以下情况

宏定义中##和#的作用

解释1 : 定义中##和#的作用内核中有很多的宏定义,在宏定义define中经常看到两个字符串##和#,这里把它的用法做一下说明:1. ####是一个连接符号,用于把参数连在一起例如:> #define FOO(arg) my##arg则> FOO(abc)相当于 myabc2.#:是"字符串化"的意思.出现在宏定义中的#是把跟在后面的参数转换成一个字符串例如:> #define STRCPY(dst, src) strcpy(dst, #src)则> STRC

C宏定义中的 #,##,#@

宏定义中会出现#xxx ,A###B,以及微软独自特有的#@xxx.分别解释. 1 define SB(x) #x 它的作用是把输入的东西转换为字符串 string str = SB(123); 2 define BB(x) UXX##x 这个是个符号连接的作用,把UXX(随意的跟符号x连接成一个新的符号,这里说的符号就是变量的意思 int BB(1); U1 = 100; 3 define CB(x) #@x 作用会是把x的最后一个字符转换成字符,这个是Windows独有的. char b =

#和##在宏定义中使用问题

转自:http://www.linuxidc.com/Linux/2014-06/102925.htm 有一道经典的C语言问题,关于宏定义中#和##符号的使用和宏定义展开问题 程序如下: #include <stdio.h>#define f(a,b) a##b#define g(a)  #a#define h(a) g(a) int main(){        printf("%s\n", h(f(1,2)));        printf("%s\n&quo

do{}while(0)在宏定义中作用

在开源代码中看到,宏定义经常这样用 #define some() do { do_somt_thing(); } while (0) 为什么这样用? 可以试一下,假如一个普通宏定义 #define some(x) Fun1(x);Fun2(x) if(condition) some(x); 变为 if(condition) Fun1(x); Fun2(x); 这样直接加个花括号不久行了,为什么还用do......while()?假如加上花括号 #define some(x) {Fun1(x);F

C 语言宏定义中使用do...while(0)

最近看到C语言的项目中在宏定义中使用了do...while(0),感到是个知识点,特来总结. 先看这句话:do{...}while(0)在C中是唯一的构造程序,让你定义的宏总是以相同的方式工作,这样不管怎么使用宏(尤其在没有用大括号包围调用宏的语句),宏后面的分号也是相同的效果.这句话的意思是说,在宏定义中使用do...while(0)包含的所有语句是一个代码块,不会受到{}:的影响. 看一个例子: #include <stdio.h> #include <stdlib.h> #d

do...while(0)在宏定义中的巧妙用法

大家都知道,do-while(condition)可以表示循环,但你有没有遇到在一些宏定义中可以不用循环的地方,也用到了 do-while.比如: #define DELETE_POINTER(p) do { if(NULL != p) delete p; p = NULL; }while(0) 这时,do-while(0)的功能就不仅仅是循环了,这是do..while(0)的一种巧妙用法.它有以下几种功能: 1.在后面要加分号,使调用如同函数:调用如下: int* p = new int(5)

define宏定义中的#,##,@#及\符号

define宏定义中的#,##,@#及\符号 在#define中,标准只定义了#和##两种操作.#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串. 1.# (stringizing)字符串化操作符.其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串.其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前. 如: #define example(instr) printf("the input string is:\t%s\n",#