【发布时间】:2014-10-20 20:05:43
【问题描述】:
我有一种暗示,有一种旧的讨厌的方法可以让函数在计算参数时运行,但是我不知道它叫什么,我无法搜索出规则。
一个例子
char dstr[20];
printf("a dynamic string %s\n", (prep_dstr(dstr),dstr));
这个想法是,“()”将在执行完 prep_dstr 函数后返回地址 dstr。
我知道这很丑陋,我可以直接在网上做 - 但它很复杂......
#好的 - 回应请求不要这样做。
我实际上正在对一些现有代码进行 MISRA 清理(不是我的,不要拍我),目前“prep_dstr”函数需要一个缓冲区来修改它(不考虑缓冲区的长度)并返回它的指针作为参数传递。
我喜欢迈出一小步 - 测试然后再迈出一小步。
所以 - 比返回一个不知道其持久性的指针稍微不那么讨厌的方法是停止函数返回一个指针并使用逗号运算符(在确保它不会跳出缓冲区的末尾之后)。
这会使 MISRA 错误倒计时,当一切仍然有效并且 MISRA 错误消失时,我将尝试优雅地解决 - 也许是后年:)。
【问题讨论】:
-
之前为什么不干脆就行了?
-
但这应该可以,不是吗?
,返回最后一个表达式的结果。 -
我不明白你在问什么。您在问题中有正确的语法(尽管我不建议使用它)。
-
“它的名称”和“为什么起作用”密切相关:operator precedence。您的
()在食物链中的位置比逗号运算符要高得多,实际上它们位于运算符优先级星系的两端。 -
MISRA-C 禁止逗号运算符。重写代码的理智且兼容 MISRA 的方法是:
prep_dstr(dstr); printf("a dynamic string %s\n", dstr);。此外,MISRA 禁止在生产代码中使用 stdio.h。