嵌入式C编程风格

Abh*_*ury 1 c embedded loops firmware

我注意到嵌入式C中的编程风格,用于固件编程:

#define WRITE_REGISTER(reg, value) \
        do { \
           write_to_register(reg, value); \
        } while (0)
Run Code Online (Sandbox Code Playgroud)

这是怎么做的... while(0)帮助结束:

#define WRITE_REGISTER(reg, value) write_to_register(reg, value)
Run Code Online (Sandbox Code Playgroud)

Jek*_*yll 9

正如你在这里看到的那样,do {} while(0)允许在宏中有多行时避免编译错误或工作不正常,并且你尝试以与ac函数相同的方式调用宏(这是每个人都这样做的方式).

作为一个例子(我在这里报告链接中的那个,所以你不需要浏览页面)

#define DO_SOMETHING_HERE(_x) foo(_x); bar(_x);

if( condition )
    DO_SOMETHING_HERE(_x);
else
    ...
Run Code Online (Sandbox Code Playgroud)

将生成编译错误,因为它将导致:

if( condition )
    foo(_x); bar(_x);;
else
    ...
Run Code Online (Sandbox Code Playgroud)

使用do虽然一切都会正常工作,但事实上它将是:

#define DO_SOMETHING_HERE(_x) do{ foo(_x); bar(_x); }while(0) 
if( condition )
   do{ foo(_x); bar(_x); } while(0);
else
   ...
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,使用大括号不会保存您,因为:

#define DO_SOMETHING_HERE(_x) { foo(_x); bar(_x); } 
if( condition )
   { foo(_x); bar(_x); };
else
  ...
Run Code Online (Sandbox Code Playgroud)

仍会产生错误.

在你的情况下,我认为它只是一种编码风格,因为只有一行.