gpt4 book ai didi

c - C 中的预处理器指令 : macros using __LINE__

转载 作者:行者123 更新时间:2023-11-30 15:20:16 25 4
gpt4 key购买 nike

我发现很难理解在预处理器指令的帮助下定义的宏的工作原理。

宏,

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)

此代码编写为在微 Controller 内部工作,其中 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

关于c - C 中的预处理器指令 : macros using __LINE__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30117982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com