奇怪的#C中的define语句

奇怪的#C中的define语句,c,embedded,C,Embedded,我有一个嵌入式C源代码。在它的定义中,有许多#定义行,如下所示: #define XNV_SPI_TX(x) st(U1CSR &= 0xFD; U1DBUF = (x);) 知道是什么吗 st() 意味着什么? 我使用IAR作为编译器和工具链。感谢评论,以下是我的发现: /* (The while condition below evaluates false without generating a * constant-controlling-lo

我有一个嵌入式C源代码。在它的定义中,有许多#定义行,如下所示:

#define XNV_SPI_TX(x)               st(U1CSR &= 0xFD; U1DBUF = (x);)
知道是什么吗 st() 意味着什么?
我使用IAR作为编译器和工具链。

感谢评论,以下是我的发现:

/* (The while condition below evaluates false without generating a
 *  constant-controlling-loop type of warning on most compilers.)
 */
#define st(x)      do { x } while (__LINE__ == -1)

感谢评论,以下是我的发现:

/* (The while condition below evaluates false without generating a
 *  constant-controlling-loop type of warning on most compilers.)
 */
#define st(x)      do { x } while (__LINE__ == -1)

此构造用于防止if/else条件显示意外行为。 例如,如果你有

#define assign() a=1;b=0;

它的行为与if/else语句中的预期不符。

此构造用于防止if/else条件显示意外行为。 例如,如果你有

#define assign() a=1;b=0;

它在if/else语句中的行为与预期不符。

碰巧,是否有一个名为
st
的函数在其中一个标题中被
extern
-ed?因为
st
调用中有语句,所以它很可能也是一个宏,请搜索它。否。我在整个项目文件中搜索了“extern st”,它还没有被定义。我认为没有人能给出比前两条评论所猜测的更好的答案。除非您为我们提供代码库。对于IAR-IDE,我很高兴每天只需重新启动IDE一到两次。是否有一个名为
st
的函数在其中一个标题中
extern
-ed?因为
st
“call”中有语句,它很可能也是一个宏,请搜索它。否。我在整个项目文件中搜索了“extern st”,它还没有被定义。我认为没有人能给出比前两条评论所猜测的更好的答案。除非你给我们提供代码库,我很高兴有了IAR-IDE,我每天只需要重新启动IDE一两次,这太奇怪了。标准的习惯用法是
do{x}while(0)
,它不会在我使用的编译器上生成警告,即使在非常极端的警告选项下也是如此。@JonathanLeffler很多编译器都喜欢警告“表达式总是正确的”,“表达式总是错误的”。无论如何,尽管(0)宏是针对没有适当编码标准的车库黑客的。如果您总是在代码中的每个control/loop语句后都写大括号,那么您不仅可以避免出现大量经典错误,而且还可以消除对包含do while(0)的模糊宏的需要。@Lundin:“很多”-您愿意提及一些吗?我还没有从GCC或CLAN中看到它(甚至在一些相当严格的警告选项下),但肯定还有其他编译器。@ JoraNehanLeffle整个Borland编译器都使用这个(虽然显然不是最新的AbjCaboro C++ + Builder,刚刚测试过),以及众多嵌入式系统编译器,例如飞思卡尔代码战士。这也声称是Visual C++给出警告,这是相当奇怪的。标准的习惯用法是
do{x}while(0)
,它不会在我使用的编译器上生成警告,即使在非常极端的警告选项下也是如此。@JonathanLeffler很多编译器都喜欢警告“表达式总是正确的”,“表达式总是错误的”。无论如何,尽管(0)宏是针对没有适当编码标准的车库黑客的。如果您总是在代码中的每个control/loop语句后都写大括号,那么您不仅可以避免出现大量经典错误,而且还可以消除对包含do while(0)的模糊宏的需要。@Lundin:“很多”-您愿意提及一些吗?我还没有从GCC或CLAN中看到它(甚至在一些相当严格的警告选项下),但肯定还有其他编译器。@ JoraNehanLeffle整个Borland编译器都使用这个(虽然显然不是最新的AbjCaboro C++ + Builder,刚刚测试过),以及众多嵌入式系统编译器,例如飞思卡尔代码战士。它也声称是Visual C++给出警告。