在C/C++中宏定义中含有##的用法
今天在学习C语言宏定义的时候发现了一个问题。定义是这样的:
#define SUM(a, b) (a + b)
#define SHARP(a,b ) (a##b)
我们都知道C/C++的宏定义仅仅是进行字符替换。
1.SUM(a,b) 会将代入,然后求和;
2.SHARP(a,b)会将a b组合在一起,成为一个字符串;
然后进行了以下的代码测试宏定义中的"+“和”##"的用法:
void testMacro()
{
using namespace std;
//cout << SUM("ab", "cd") << endl; //报错 "+":不能加两个指针
cout << SUM('ab', "ef") << endl; //能运行,输出比较怪异
cout << SUM('a', "ef") << endl; //能运行,输出比较怪异
cout << SUM('ab', 'ef') << endl; //'ab'表示一个整数的按字节组成
cout << SUM('a', 'c') << endl; //输出'a'和'c'的ASCII码之和,97+99
cout << SHARP("ab", "cd") << endl; //输出abcd的字符串
cout << SHARP("a", "b") << endl; //输出ab
//cout << SHARP("a" 'b') << endl; //语法错误,常量
//cout << SHARP("a" 12) << endl; //语法错误,常量
cout << SHARP(12, 34) << endl; //输出1234的字符串
}
这段代码运行后的结果是:
C++ int还可以这么初始化
在上面的 SUM(‘ab’, ‘ef’) 中可以发现,在进行宏替换的时候,ab被替换成了一个数字,ef也被替换成了一个数字。然后做了一个简单的测试。代码如下:
void testIntNum()
{
using namespace std;
int nVal = 'abcd';
//nVal = 'ABCD';
cout << "the ASCII of 'a' is :" << (short)('a') << endl;
//cout << "the ASCII of 'A' is :" << (short)('A') << endl;
cout << ((nVal & 0xFF000000) >> 24) << endl;
cout << ((nVal & 0x00FF0000) >> 16) << endl;
cout << ((nVal & 0x0000FF00) >> 8) << endl;
cout << ((nVal & 0x000000FF) >> 0) << endl;
}
果然,输出结果是这样的:
以前好像从来没遇到过C/C++中的int类型是这样初始化的,因为我用的是VS2015测试的,所以就想找个别的IDE/编译器试试。于是就用了MinGW的编译器试了一下。
用的stdio和.c的后缀,看样子是不行的。
于是。试一下iostream和.cpp的实现
可以看出C++的形式是可以的,不过编译器报了一个警告。
总结
以前找资料总是习惯于CSDN几下就找到了,今天也是提起干劲儿开始了自己写了。所以,共同分享!共同进步!
新增测试
测试代码
void testIntNum2()
{
char cArr[] = { 'a','b','c','d' };
int nVal = 0;
cout << hex;
memcpy(&nVal, cArr, sizeof(nVal));
cout << "use memcpy" << endl;
cout << " addr of nVal: 0x" << &nVal << endl;
cout << " value of nVal: 0x" << nVal << endl;
cout << "direct Assignment" << endl;
nVal = 'abcd';
cout << " addr of nVal: 0x" << &nVal << endl;
cout << " value of nVal: 0x" << nVal << endl;
}
运行结果: