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_OUTRXEM_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