2014-08-27 129 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原則之一說:「不要阻止程序員做所做的事情。」

但是,無論你做什麼,都要嘗試編寫可讀代碼。