C 为什么使用这个宏?
我正在尝试使用Texas Instruments示例编写一些微控制器代码,它在任何地方都使用宏(可能是为了减少代码大小),其中一些宏被st()包围。在阅读了评论之后,我仍然不明白为什么这是必要的,或者我应该在什么时候使用它:C 为什么使用这个宏?,c,macros,C,Macros,我正在尝试使用Texas Instruments示例编写一些微控制器代码,它在任何地方都使用宏(可能是为了减少代码大小),其中一些宏被st()包围。在阅读了评论之后,我仍然不明白为什么这是必要的,或者我应该在什么时候使用它: /* * This macro is for use by other macros to form a fully valid C statement. * Without this, the if/else conditionals could show une
/*
* This macro is for use by other macros to form a fully valid C statement.
* Without this, the if/else conditionals could show unexpected behavior.
*
* For example, use...
* #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; )
* instead of ...
* #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; }
* or
* #define SET_REGS() ioreg1 = 0; ioreg2 = 0;
* The last macro would not behave as expected in the if/else construct.
* The second to last macro will cause a compiler error in certain uses
* of if/else construct
*
* It is not necessary, or recommended, to use this macro where there is
* already a valid C statement. For example, the following is redundant...
* #define CALL_FUNC() st( func(); )
* This should simply be...
* #define CALL_FUNC() func()
*
* (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)
你能举一些例子说明当st不在时什么会失败吗?在没有必要的地方添加st有什么害处吗
st
代表什么?带有{something}
的第二个示例何时产生编译器错误?因为在一些示例代码中也使用了这种方法。do{…}while(0)”是一种用于避免某些类型问题的技术
\uuuu行\uuuu==-1
可能用于避免某些编译器警告<代码>\uuuu行\uuuu==-1将始终为false
查看此链接,它将解释“do…while(0)”的原因
示例:
#define a(x) if(x) { printf("%s\n", "OK"); }
int i = 1;
if(0)
a(i);
else
printf("%s\n", "KO");
将扩展到相当于:
if(0)
{
if(x)
{
printf("%s\n", "OK");
}
else printf("%s\n", "KO");
}
但是,如果将a(x)
定义为:
#define a(x) st(if(x) { printf("%s\n", "OK"); })
它将发挥作用,扩展到:
if(0)
{
do
{
if(x)
{
printf("%s\n", "OK");
}
}
while(0);
}
else printf("%s\n", "KO");