C/C++中“#”和“##”的作用和用法
生活随笔
收集整理的這篇文章主要介紹了
C/C++中“#”和“##”的作用和用法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在C/C++的宏中,”#”的功能是將其后面的宏參數進行字符串化操作(Stringfication),簡單說就是在對它所引用的宏變量通過替換后在其左右各加上一個雙引號。
???????? 而”##”被稱為連接符(concatenator),用來將兩個子串Token連接為一個Token。注意這里連接的對象是Token就行,而不一定是宏的變量。還可以n個##符號連接n+1個Token,這個特性是#符號所不具備的。
???????? 凡是宏定義里有用’#’或’##’的地方宏參數是不會再展開。
???????? 若要使’#’和’##’的宏參數被展開,可以加多一層中間轉換宏。加這層宏的用意是把所有宏的參數在這層里全部展開,那么在轉換宏里的那一個宏就能得到正確的宏參數。
以下是測試代碼:
#include "jinghao.hpp"
#include <iostream>//test1
#define WARN_IF(EXP) \if (EXP) \fprintf(stderr, "warning: "#EXP" \n");//test2
#define STR(s) #s//test3
#define _STRI(s) #s
#define STRI(s) _STRI(s) //轉換宏//test4
#define paster(n) printf("token"#n" = %d\n", token##n)//test5
#define _CONS(a, b) int(a##+##b)
#define CONS(a, b) _CONS(a, b) //轉換宏//test6
#define _GET_FILE_NAME(f) #f
#define GET_FILE_NAME(f) _GET_FILE_NAME(f) //轉換宏//test7
#define _TYPE_BUF_SIZE(type) sizeof #type
#define TYPE_BUF_SIZE(type) _TYPE_BUF_SIZE(type) //test8
#define D(x) #@x //僅對單一標記轉換有效int test_jinghao1()
{//test1int divider = 0;WARN_IF(divider == 0);// warning: divider == 0//test2printf("int max: %s\n", STR(INT_MAX));// int max: INT_MAX//test3printf("int max: %s\n", STRI(INT_MAX));// int max: 2147483647//test4int token9 = 9;paster(9);// token9 = 9//test5int A = 15, B = 2;printf("A + B = %d\n", CONS(A, B));// A + B = 17//test6char FILE_NAME[] = GET_FILE_NAME(__FILE__);std::cout << FILE_NAME << std::endl;// "..\\..\..\\demo\\CppBaseTest\\jinghao.cpp"//test7std::cout << TYPE_BUF_SIZE(INT_MAX) << std::endl;// 11//test8std::cout << D(F) << std::endl;//Freturn 0;
}#define CHECK_PARAMS(condition, ret) \{if (!(condition)) { \fprintf(stderr, "Error: "#condition" %d\n", ret); \return ret;}}int test_jinghao2()
{int* param1 = nullptr;CHECK_PARAMS(param1, -1);// Error: param1 -1return 0;
}
以上內容整理自:
1.??????http://keendawn.blog.163.com/blog/static/888807432011527113124144/
2.??????http://www.cppblog.com/just51living/archive/2011/08/08/152752.html
3.??????http://blog.csdn.net/acs713/article/details/6891837
總結
以上是生活随笔為你收集整理的C/C++中“#”和“##”的作用和用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 接口冲突的一种解决方法
- 下一篇: 内存泄漏检测工具VLD在VS2010中的