C 中的预处理器指令:使用 __LINE__ 的宏
Preprocessor directives in C : macros using __LINE__
我发现很难理解借助预处理器指令定义的宏的工作原理。
宏,
TRXEM_SPI_BEGIN()
是在从两个头文件引用的两个预处理器指令的帮助下定义的。首先,我想声明一下上述宏的声明。
#define TRXEM_SPI_BEGIN() st( TRXEM_PORT_OUT &= ~TRXEM_SPI_SC_N_PIN; NOP();)
由于此处缺少宏st ()
的声明,我发现它定义在不同的头文件中,ti如下所示。
#define st(x) do { x } while (__LINE__ == -1)
现在合并两个宏后,宏的真正定义TRXEM_SPI_BEGIN()
一定是,
#define TRXEM_SPI_BEGIN() do {
( TRXEM_PORT_OUT &= ~TRXEM_SPI_SC_N_PIN; NOP(); )
} while (__LINE__ == -1)
此代码是为在微控制器内部工作而编写的,其中 TRXEM_PORT_OUT
、RXEM_SPI_SC_N_PIN
是内存映射寄存器,NOP
启动一个不执行任何操作的指令周期。
按照我的理解,__LINE__
是c文件中__LINE__
所在的代码行。该行永远不会等于 -1
。也就是说,此循环必须始终 运行 仅一次 前提是 __LINE__
永远不能放在 .c
文件中的 -1
位置。简单地说,-1
永远不可能是__LINE__
的值。
因此,我认为这里的 do while()
循环是不必要的,并且可以通过简单地不使用任何循环来实现相同的输出。
我不明白这个宏的作用。如果有人可以详细说明,我将不胜感激。
As per my understanding, means the line of code in the c file
where __LINE__
lies. That line can never be equal to -1. i.e. this
loopmust always be running only once provided the __LINE__
can never
be placed in -1 place in a .c file. Simply put, -1 can never be the
return value to a __LINE__
.
你的理解完全正确。它是为了确保代码只运行一次。
考虑以下场景:
#define BAZ foo();bar();
现在如果你这样做
if(some_cond) BAZ;
这相当于:
if(some_cond) foo();
bar();
这很可能不是您想要的。所以你把它改成:
#define BAZ {foo();bar();}
如果写成 if(some_cond) foo() else wow();
就可以正常工作,但如果写成 if(some_cond) foo(); else wow();
就会编译失败
所以你定义BAZ
为
/* No semicolon at end */
#define BAZ do {foo();bar();} while(condition_which_is_always_false)
您现在可以编写自然代码,并在末尾添加直观的分号。
在你的情况下,condition_which_is_always_false
是 __LINE__ == -1
我发现很难理解借助预处理器指令定义的宏的工作原理。
宏,
TRXEM_SPI_BEGIN()
是在从两个头文件引用的两个预处理器指令的帮助下定义的。首先,我想声明一下上述宏的声明。
#define TRXEM_SPI_BEGIN() st( TRXEM_PORT_OUT &= ~TRXEM_SPI_SC_N_PIN; NOP();)
由于此处缺少宏st ()
的声明,我发现它定义在不同的头文件中,ti如下所示。
#define st(x) do { x } while (__LINE__ == -1)
现在合并两个宏后,宏的真正定义TRXEM_SPI_BEGIN()
一定是,
#define TRXEM_SPI_BEGIN() do {
( TRXEM_PORT_OUT &= ~TRXEM_SPI_SC_N_PIN; NOP(); )
} while (__LINE__ == -1)
此代码是为在微控制器内部工作而编写的,其中 TRXEM_PORT_OUT
、RXEM_SPI_SC_N_PIN
是内存映射寄存器,NOP
启动一个不执行任何操作的指令周期。
按照我的理解,__LINE__
是c文件中__LINE__
所在的代码行。该行永远不会等于 -1
。也就是说,此循环必须始终 运行 仅一次 前提是 __LINE__
永远不能放在 .c
文件中的 -1
位置。简单地说,-1
永远不可能是__LINE__
的值。
因此,我认为这里的 do while()
循环是不必要的,并且可以通过简单地不使用任何循环来实现相同的输出。
我不明白这个宏的作用。如果有人可以详细说明,我将不胜感激。
As per my understanding, means the line of code in the c file where
__LINE__
lies. That line can never be equal to -1. i.e. this loopmust always be running only once provided the__LINE__
can never be placed in -1 place in a .c file. Simply put, -1 can never be the return value to a__LINE__
.
你的理解完全正确。它是为了确保代码只运行一次。
考虑以下场景:
#define BAZ foo();bar();
现在如果你这样做
if(some_cond) BAZ;
这相当于:
if(some_cond) foo();
bar();
这很可能不是您想要的。所以你把它改成:
#define BAZ {foo();bar();}
如果写成 if(some_cond) foo() else wow();
就可以正常工作,但如果写成 if(some_cond) foo(); else wow();
所以你定义BAZ
为
/* No semicolon at end */
#define BAZ do {foo();bar();} while(condition_which_is_always_false)
您现在可以编写自然代码,并在末尾添加直观的分号。
在你的情况下,condition_which_is_always_false
是 __LINE__ == -1