-v0.1 2020.8.12 Sherlock init
##
用来拼接前后的符号
#
用来把一个符号字符串化
宏参数还是一个宏的展开规则是,如果宏是一个简单的宏就先展开里面的宏,再依次
展开外面的宏。
如果宏的实现是一个使用##或者#的宏,那么直接使用##或者#的规则。
如果要使得比如下面test case 4的到“19”的输出,需要中间转下,类似case 5的写法。
#include
#define TEST(a, b) a##b
#define STR(a) #a
#define A 1000
#define ADD(a, b) ((a) + (b))
#define _TEST(a, b) TEST(a, b)
#define _STR(a) STR(a)
int main()
{
printf("test 1: %d\n", TEST(1, 5));
printf("test 2: %s\n", STR(just_test));
printf("test 3: %d\n", ADD(A, A));
/* test case 4 */
printf("test 4: %s\n", STR(TEST(1, 9)));
/* test case 5 */
printf("test 5: %s\n", _STR(TEST(1, 9)));
return 0;
}
输出:
xxx@kllp05:~/tests/c_note$ ./a.out
test 1: 15
test 2: just_test
test 3: 2000
test 4: TEST(1, 9)
test 5: 19
https://www.cnblogs.com/alantu2018/p/8465911.html
各种截断数据
float类型不能比较相等,不相等
sizeof() 返回一个unsigned int
有符号数和无符号数运算、赋值: https://akaedu.github.io/book/ch15s03.html
有符号右移,带符号位右移
http://mjfrazer.org/mjfrazer/bitfields/
这个实例说明为什么写代码的时候,特别是涉及底层硬件寄存器操作的驱动代码,尽量
不要用位域。原因是在大小端不同的系统上,位域的表示方法是不同的。
printf %n: 已输出的字符数目(用户对齐下一行的输出比较有用 )
#include
int main()
{
int num;
printf("123456:%n\n", &num);
printf("%*c %d\n", num, ' ', 123);
printf("%*c %d\n", num, ' ', 456);
return 0;
}
输出:
xxx@kllp05:~/tests/c_note$ ./a.out
123456:
123
456
setjmp, longjmp: https://www.cnblogs.com/hazir/p/c_setjmp_longjmp.html
https://www.cnblogs.com/cpoint/p/3368993.html
https://www.cnblogs.com/zhaoyl/p/3954232.html
const char ** p; char * const * p; char ** const p;
分别是**p, *p, p是常量。
…