0

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

一个例子

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

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

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

#

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

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

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

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

这会使 MISRA 错误倒计时,当它仍然有效并且 MISRA 错误消失时,我将尝试优雅地解决 - 也许是后年:)。

4

3 回答 3

2

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

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

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

   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 的原则之一说:“不要阻止程序员做已经做过的事情。”

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

于 2014-08-27T10:10:47.407 回答
1

是的,您使用的语法将适用于您的目的。

但是,请考虑编写干净易读的代码。例如,

char buffer[20];

char *destination = prepare_destination_string(buffer);

printf("a dynamic string %s\n", destination);

一切都可以清楚地命名和理解,并且易于推断出预期的行为。如果您愿意,您甚至可以省略某些部分,例如destination,或者执行更简单的错误检查。

于 2014-08-27T09:41:32.297 回答
0

你的暗示和你的代码都是正确的。也就是说,请不要这样做。把它放在prep_dstr自己的线路上可以更容易地推断出发生了什么以及何时发生。

您正在考虑的是逗号运算符。在逗号还没有其他含义的上下文中(例如分隔函数参数),表达式a, b的值为b,但a首先计算。代码中额外的括号导致逗号以这种方式解释,而不是作为函数参数分隔符。

于 2014-08-27T09:45:58.730 回答