2014-08-27 108 views
0

我有一个暗示有一个古老的讨厌的方式来获取函数作为参数计算运行,但正弦我不知道它叫什么我不能搜出规则。c语言中的语法是什么语法作为参数

一个例子

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

的想法是,在“()”将在已执行prep_dstr功能之后返回的地址DSTR。

我知道这是丑陋的,我可以做它的前行 - 但它是复杂的...

确定 - 在回答恳求不要这么做。

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

我喜欢采取一小步 - 再测试一小步。

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

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

+2

为什么不直接在线上做呢? – user2357112 2014-08-27 09:40:26

+0

但是,这应该工作,不是吗?用','返回最后一个表达式的结果。 – martin 2014-08-27 09:42:40

+0

我不明白你在问什么。你在问题中有正确的语法(虽然我不建议使用它)。 – interjay 2014-08-27 09:42:59

回答

1

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

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

char buffer[20]; 

char *destination = prepare_destination_string(buffer); 

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

一切都可以清晰地命名为&理解和预期的行为很容易推断。如果您愿意的话,您甚至可以省略某些部分,例如destination,或者执行更容易的错误检查。

0

您的注释和您的代码都是正确的。这就是说,请不要这样做。将prep_dstr放在其自己的行上,可以更容易地推断发生什么事情以及何时发生。

你在想什么是逗号运算符。在逗号不具有其他含义(如分隔函数参数)的情况下,表达式a, b的值为b,但首先计算a。代码中的额外括号会导致逗号被这样解释,而不是作为函数参数分隔符。

2

逗号运算符具有相应的优先级,此外它还提供了一个序列点,即它定义了程序的执行流程中的一个点,其中解决了所有以前的副作用。
因此,无论您的功能prep_dstr()对字符串dstr有何作用,它都会在达到逗号运算符之前完成。

另一方面,逗号运算符给出一个表达式,其值是最正确的操作数。

下面的例子给你价值dstr,只要你想:

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

当然,这样的表达可以在任何需要的字符串dstr使用。

Theerefore,您在问题中使用的语法,那么它完美地完成了这项工作。

由于您可以使用该语法,因此您可以使用另一种可能性。
考虑到函数printf()是一个函数,它特别是一个表达式。
通过这种方式,它可以被放在一个逗号表达式:

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

似乎每一次的身体告诉你,“不以这种方式编写代码等等等等......”。
这种编程风格的宗教建议被高估了。
如果你需要做某件事,就去做吧。

C原则之一说:“不要阻止程序员做所做的事情。”

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