我发现很难理解在预处理程序指令的帮助下定义的宏的工作原理。
宏,
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__
所在的c文件中的代码行。该行永远不能等于-1
。即,只有__LINE__
永远不能放在-1
文件的.c
位置,此循环必须始终只运行 。简而言之,-1
永远不会是__LINE__
的价值。
因此,我认为这里不需要do while()
循环,只需不使用任何循环就可以实现相同的输出。
我不明白这个宏的功能。如果有人可以详细说明,我会非常感激。
答案 0 :(得分:1)
根据我的理解,表示c文件中的代码行
__LINE__
所在的地方。该行永远不能等于-1。即这个 如果__LINE__
永远不能,loopmust只能运行一次 放在.c文件中的-1位置。简单地说,-1永远不会是 将值返回到__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