2010-07-23 67 views
3

爲了使我的代碼更簡潔,我可以這樣做複合參數聲明

int f(int const x, y, z), g(int const x, y, z); 

聲明函數f和g,每個取3個int常量參數?

編輯: 也許這裏是一個更好的例子:

int f(int const a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z); 

怎麼會不是是不是把INT常量的每一個字母之前更簡潔,可讀性?

+0

試一試並編譯它。它工作嗎? – Anthony 2010-07-23 04:23:49

+0

@Duracell:注意單詞「like」。 – user383352 2010-07-23 04:25:08

+0

也許我錯過了這是如何使代碼更加consise而不是更少可讀性。也許一個更好的例子會顯示我錯過了什麼? – 2010-07-23 04:26:24

回答

2

使用Boost預處理器,並考慮你不在乎來描述一個函數參數之一(但不是你的問題點),可以使用下面的技巧:

#include <boost/preprocessor/repetition/enum_params.hpp> 

int f(BOOST_PP_ENUM_PARAMS(26, int const arg)); 

但不要忘記,沒有花時間和空間來描述函數參數的想法是非常危險的。

0

都能跟得上:)

順便說一句,有些人會便便,便便你這樣做,即使它是可能的。另一方面,C++的簡潔性並不爲人所知。

0

據我所知,沒有。我認爲這會讓你的代碼更加「簡潔」,就像刪除註釋和空白一樣。它會使它看起來更短,但是它的可讀性會低得多。 我喜歡這樣一個事實,即每個函數聲明都必須非常明確,並且在C++中是獨立的(儘管我從未遇到允許聲明多個函數的語言)。 所以,總之,沒有。

+0

技術上用一個表達式來聲明多個函數。 – 2010-07-23 04:40:58

4

對於C代碼,如果你真的堅持下來,你可以使用舊式(K & R)功能標題:

typedef int const cint; 

int f(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z) 
cint a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z; 
{ 
    // function body here 
} 

請注意,我不推薦這 - 和C++不支持這個,所以你可以使用它的唯一方法是使用C編譯函數本身,並且包含一個extern "C"聲明以從C++訪問它。

但是,我還要指出,無論如何,整個想法都讓我感到無聊。首先,一個具有足夠參數的功能值得考慮,基本上保證是一場災難。其次,頂級const(即應用於參數本身,而不是指向或指向的參數)是完全沒有意義的,並且在任何情況下(IMO)都是一個糟糕的主意。

0

爲什麼你需要那個?輸入幾個額外的字符並沒有太大的區別。如果你需要的不僅僅是一些方法,你應該重構代碼,所以你不必傳遞很多參數。

話雖如此,在某些情況下,正確的解決方案可能是使用可變參數的功能,所以你可以做:

int f(const int arg1, ...) 
1

如果你正在服用的是,許多同一類型的參數,它的時間來喚醒並採取std ::/std :: tr1 ::/boost :: array<int, count> const&。這就是陣列的用途。