仅在 C 中执行一次代码的更简洁的方法?

Posted

技术标签:

【中文标题】仅在 C 中执行一次代码的更简洁的方法?【英文标题】:A more consise way of executing code once only in C? 【发布时间】:2019-09-01 01:14:14 【问题描述】:

我经常有以下形式的代码:

uint8_t bool_var = 0;

for (;;) 
    ...
    if (!bool_var) 
       do_something();
       bool_var = 1;
    
    ...

是否有更简洁、非宏的方式来表达 if 条件和块?

【问题讨论】:

你必须扩展上下文,因为代码通常只会运行一次,除非你做一些事情让它再次运行,比如把它放在一个循环中。 对我来说看起来非常可读和简洁。在 C++ 中,你可以用函子做一些技巧,但在纯 C 中,任何更短的东西都会使它变得神秘 IMO。 @DavideVisentin - 所以不要再次进入这个块进行 255 次迭代? @DavideVisentin 我一直在考虑这一点,但最终它会结束,尤其是在 uin8_ts 的 ATMEGA 上。 如果您排除宏来隐藏代码,我认为这是最好的方法。如果您有for(int i=0; i<...; ++i),您可以删除布尔变量并将其替换为if (i==0),但除此之外...... 【参考方案1】:

您的代码在大多数情况下都尽可能易读和简单。


但是,出于非常特定的目的,您可能会发现自己总是想调用一个函数,但有时却没有效果。那么在函数指针上使用一些技巧也许是有意义的:

typedef void func_t (void);
...
func_t* do_stuff = do_something;
... 

while(stuff) // this code can't be changed for whatever reason

  do_stuff();

在这种情况下,你可以想出这个:

void nop (void) 
...
do_stuff = nop;

现在您可以继续拨打do_stuff,但不会发生任何事情。

【讨论】:

以上是关于仅在 C 中执行一次代码的更简洁的方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby 中进行分组的更简洁的方法

更新数组中对象的更简洁方法

使用 NGXS 订阅操作流的更简洁方式

通过多个可能的属性值进行选择的更简洁的方法?

使用千位分隔符格式化 COUNT 结果的更简洁方法?

在 React 中将状态变量和方法传递给子组件的更简洁的方法?