C:宏中的预处理程序指令使用__LINE__

时间:2015-05-08 07:16:48

标签: c header preprocessor-directive

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

宏,

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__所在的c文件中的代码行。该行永远不能等于-1。即,只有__LINE__永远不能放在-1文件的.c位置,此循环必须始终只运行 。简而言之,-1永远不会是__LINE__的价值。

因此,我认为这里不需要do while()循环,只需不使用任何循环就可以实现相同的输出。

我不明白这个宏的功能。如果有人可以详细说明,我会非常感激。

1 个答案:

答案 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