*1.对于#号的预处理说明*
在C语言的宏中,#的功能举例来说
1.#define int int32; 即在预处理过程中将int32替换为int
2.#define g(x) #x #用于把宏定义中的参数x两端加上字符串的""
*在C语言的宏中,##的功能举例*
1.#define WIDE(str) L##str
则会将形参str的前面加上L 比如:WIDE("abc")就会被替换成L"abc" 如果有#define FUN(a,b) vo##a##b()那么FUN(id ma,in)会被替换成void main()
3.#define CREATE_XVER(maj, min, build, fix) maj##,min##,build##,fix
与第二个一样,宏定义替换为maj,min,bulid,fix可以作为参数列表(嵌套的宏定义)如下代码所示
4.##__VA_ARGS__这里的‘##’有特殊作用
__VA_ARGS__是可变参数宏,用法如下:
#define Debug(...) printf(__VA_ARGS__) //代码里有使用例程
#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
当可变参数宏为空的时候,”“##”的作用就是让编译器忽略前面一个逗号,不然编译器会报错,参数不匹配。
#include<stdio.h>
#include "stdafx.h"
#include "head.h"
#define LINK_MULTIPLE(a,b) a##b
#define CREATE_XVER(maj, min, build, fix) maj##,min##,build##,fix
#define VER_MAJOR 4
#define VER_MINOR 0
#define VER_BUILD 13657
#define VER_FIX 0
#define STR(str) #str //#用于把宏定义中的参数两端加上字符串的""
#define Debug(...) printf(__VA_ARGS__)
#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
void fun(int a,int b,int c,int d)
{
printf("a=%d b=%d c=%d d=%d\n",a, b, c, d);
}
int _tmain(int argc, _TCHAR* argv[])
{
int y = 123;
printf("%s\n", STR(1234));
printf("%s\n", LINK_MULTIPLE("a","b"));
fun(CREATE_XVER(1, 2, 3, 4));
Debug("Debug Y = %d\n", y);
debug("debug Y = %d\n", y);
getchar();
return 0;
}
