2013-06-01 104 views
4

我正在編寫C語言中的非破壞性轉換例程,我剛剛意識到(至少在Visual C++中)函數是按相反順序解析的。C函數解析順序

所以:

main() 
{ 
char* psString[] = { "Hello", "World", "World2", "World3" }; 

printf("%s - %s - %s - %s\n", 
    H2A_N(psString[0]), 
    H2A_N(psString[1]), 
    H2A_N(psString[2]), 
    H2A_0(psString[3])); 

return 1; 
}; 

我的代碼是不可重入並且僅運行在一個單獨的線程,所以我打算用字符的靜態數組存儲結果。

我的計劃是有一個函數H2A_0,它將輸出寫入緩衝區的起始處,並留下下一個地址以便隨後調用H2A_N。我認識到這種方法有一些缺點,但我必須將這個轉換例程應用於很多現有的代碼,所以越簡單越好(我不想混亂釋放內存)。

我的問題是:

  1. 這是不是C標準的一部分,以解決功能以相反的順序(當它們被作爲參數傳遞給其他函數)。
  2. 有沒有更好的方法來做到這一點?
+0

嘗試將字符串與'的strdup複製()'。 'main()'的標準返回值應該是'0'。 –

+1

c.f. http://stackoverflow.com/questions/621542/compilers-and-argument-order-of-evaluation-in-c – imallett

+1

@ ott--:我不確定''strdup()'在Windows上是否可用。至少,它不是C標準的一部分(這是一個POSIX函數,就像'fork()')。 –

回答

7

沒有確定的參數評估順序。編譯器可以自由決定評估它們的順序,因爲它是可取的。

標準,C11的最新版本,是這麼說的這樣,§6.5.2.2/ 10:

有功能指定者的評估和實際 爭論之後,但在序列點實際的通話。在執行被調用函數之前或之後,在調用函數(包括 其他函數調用)中進行的每個評估都不會被執行被調用函數,而是被不確定地排序。

如果您希望強制執行特定的評估順序,您需要將表達式從函數調用中拉出,然後將它們保存到本地變量中。

int param1 = foo(...); 
int param2 = bar(...); 
DoSomething(param1, param2); 

有沒有更好的方式來做到這一點?

很可能。具有函數返回值並將副作用應用於固定長度的靜態分配的緩衝區通常不被認爲是最佳實踐。不過,我不想告訴你如何解決你的問題,因爲我對這個問題不夠了解。

-2

應先檢查。沒有確定的解決順序。大多數編譯器似乎從右向左解決。

1

是否以相反順序解析函數(當它們是作爲參數傳遞給其他函數時)的C標準的一部分。

函數參數被評估爲一個表達式;因此它是實現定義的,如在x = f() + g()中。如果f()之前會調用到g()依賴於編譯器到編譯器,請檢查出sequence point

一些編譯器,等給出這個警告icc可以:

此言#981:操作數未指定的順序進行評估