c - c中将语句组合为参数的语法是什么

标签 c misra

我知道有一种古老的讨厌的方法可以让函数在计算参数时运行,但正弦我不知道它叫什么我无法搜索规则。

一个例子

char dstr[20];
printf("a dynamic string %s\n", (prep_dstr(dstr),dstr));

想法是“()”将在执行完 prep_dstr 函数后返回地址 dstr。

我知道这很丑,我以前可以在线上做 - 但它很复杂......

#

好的 - 作为对不要这样做的请求的回应。

我实际上正在对一些现有代码进行 MISRA 清理(不是我的,别拍我),目前 'prep_dstr' 函数接受一个缓冲区修改它(不考虑缓冲区的长度)并返回它的指针作为参数传递。

我喜欢迈出一小步 - 测试然后再迈出一小步。

因此 - 比返回一个不知道其持久性的指针稍微不那么令人讨厌的方法是停止函数返回一个指针并使用逗号运算符(在确保它不会从缓冲区的末尾跳出之后)。

这让 MISRA 错误倒计时,当它仍然有效并且 MISRA 错误消失时,我将尝试绕过优雅 - 也许在下一年 :)。

最佳答案

逗号运算符具有适当的优先级,此外,它还提供了一个序列点,也就是说,它在程序的执行流程中定义了一个点,在此之前所有的副作用都得到了解决。< br/> 因此,无论您的函数 prep_dstr() 对字符串 dstr 执行什么操作,它都会在到达逗号运算符之前完全执行。

另一方面,逗号运算符给出的表达式的值是最右边的操作数。

以下示例根据需要为您提供值 dstr:

   5+3, prep_dstr(dstr), sqrt(25.0), dstr;
   a+b-c, NULL, dstr;
   (prep_dstr(dstr), dstr);

当然,只要你需要字符串dstr,就可以使用这样的表达式。

因此,您在问题中使用的语法可以完美地完成工作。

既然您愿意尝试使用语法,那么您还可以使用另一种可能性。
考虑到函数 printf() 是一个函数,它尤其是一个表达式。
这样,就可以放在逗号表达式中:

  prep_dstr(dstr), printf("Show me the string: %s\n", dstr);

似乎每个人都在告诉你“不要以这种方式编写代码……”。
这种编程风格中的宗教建议被高估了。
如果你需要做某事,那就去做吧。

C 的原则之一是:“不要阻止程序员做已经完成的事情。”

但是,无论您做什么,请尝试编写可读代码。

关于c - c中将语句组合为参数的语法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25523752/

相关文章:

c++ - 带 alpha 的 DrawPrimitive

c - 函数 chdir() 表现异常

C: 动态 2D 矩阵重新分配

c - 如何将 C 程序的输出重定向到文件?

c - 是否可以禁用外部库的 MISRA 检查?

c - 参数数量有限的 printf 的替代方案?

c++ - 在源代码中嵌入较长文本的技巧,如 Perl 等语言?

c++ - 具有静态方法的模板专用类是否占用存储空间?

c++ - 在 MISRA C++ 2008 中,有人知道规则 5-0-3 中出现的特殊概念 Cvalue 表达式吗?

c - 宏定义中的 Misra C 错误