2011-04-21 57 views
2

對不起有人可能是一個愚蠢的問題:C varargs是否使用了一個名爲'end'的關鍵字?

我有很多使用C風格變量參數的代碼。代碼在可變長度函數調用的最後傳入一個變量,名稱爲end。而且......代碼也有一個叫做的枚舉器,結尾爲。到目前爲止,他們並沒有發生衝突(編譯器錯誤說它有一個模糊的定義:它不會告訴我神祕的第二個'end'是在哪裏定義的),直到我改變爲vc 10.0編譯器(VS 2010)。

So is end某種保留關鍵字特別用於變量參數? 我對他們知之甚少。但是我已經查看了大量關於可變參數的文檔,並且在這裏搜索,並且沒有發現任何東西(這可能是件好事)。所以我想,答案是結束是不是一個特殊的詞用於可變參數。我可以讓某人確認嗎?

感謝

回答

4

否 - C沒有定義end具有可變參數的任何特殊含義。當你編寫一個帶有可變參數列表的函數時,由你決定如何告訴它列表已經傳遞了多長時間。一些常用的參數是第一個參數指定(至少間接)多少個參數,並在所有其他參數之後傳遞「sentinel」值(例如NULL)。對於幾個例子,前者printf,後者execl

+0

'execl',當然。無論如何,這帶來了另一個問題 - execl只能以這種方式工作,因爲它的參數[包括NULL]的_all_是相同的類型:'char *'。這個問題的「結束」只有在與他的函數期望的其他參數類型相同時才能起作用。 – Random832 2011-04-21 17:05:09

+0

而不是:我的代碼中的'結束'只是在用戶定義的長枚舉列表的末尾。所以它不是任何附近的char *。 – 2011-04-21 17:06:39

+0

RRandom832:哎呀,是的 - 謝謝。糾正。 – 2011-04-21 17:06:49

2

很久以前(例如Unix的第7版),定義了三個外部符號:etext,edataend。這些對應於代碼的高地址,初始化數據和堆。不知何故,你的定義可能與end相沖突。

+0

啊,我忘了把我的問題標記爲僅限於Windows。抱歉。 – 2011-04-21 17:09:16

+1

有趣的無所謂。 – 2011-04-21 17:10:50

相關問題