1.
#define Conn(x,y) x##y
x##y表示x连接y,举例说明:
int n = Conn(123,456); 结果就是n = 123456;
char* str = Conn("abc","def"); 结果就是 str = "abcdef";
2.
#define ToChar(x) #@x
#@x,就是给x加上单引号,结果返回一个 const char,举例说明:
char a = ToChar(1); 结果就是 a = '1';
做个越界试验 char a = ToChar(123); 结果是 a = '3';
但是如果参数超过四个字符,编译器就会报错。
3.
#define ToString(x) #x
#x就是给x加上双引号,举例说明:
char* str = ToString(1234); 结果是 str = "1234";
理解系统调用:
(一)
#define _syscall0(type,name) \
type name(void) { \
register long __res_r0 __asm__("r0"); \
long __res; \
__asm__ __volatile__ ( \
__syscall(name) \
: "=r" (__res_r0) \
: \
: "lr"); \
__res = __res_r0; \
__syscall_return(type,__res); \
}
(二)
#define __syscall(name) "swi\t" __sys1(__NR_##name) ""
#define __sys1(x) __sys2(x)
#define __sys2(x) #x
(三)
#define __NR_fork (__NR_SYSCALL_BASE+ 2)
#define __NR_SYSCALL_BASE 0x900000
那么 _syscall0(int, fork)中 __syscall(name) 替换后为:
(1) 替换name======>“swi\t" __sys1(__NR_##fork) ""
(2) ##为连接的意思,故为=========> "swi\t " __sys1(__NR_fork) ""
(3)替换__NR_fork,故为==========> "swi\t " __sys1(0x900002) ""
(4)替换__sys1(x),故为============> "swi\t " __sys2(0x900002) ""
(5)#为给x加双引号,故为==========> "swi\t "0x900002" ""
(6)故最后变成:"swi\t 0x900002 "
其意思即为fork的系统调用,最后变成了一个软中断调用,地址为0x900002
===================================================================================================
常规用法不再介绍,做如下几点说明和介绍
1. 带参数的宏只完成简单字符替换,之前不做计算实参的工作,如下