2012-08-29 175 views
0
struct s1 { int a; int b; }; 
struct s2 { int a; int b; }; 

struct s2 test(void) { 
    struct s1 s = { 1, 2 }; 
    return s; // incompatible types 
} 

在上面的代碼,可以我返回s而不創建新struct s2變量並使用s的值填充了嗎?確保struct s1將始終與struct s2相同。返回相同的結構,但用不同的名稱

+1

當你想返回一個s1的實例時,爲什麼有一個返回值類型爲s2? – mathematician1975

+0

在我看來,返回一個結構只是一個壞主意。相反,我會要求調用者傳遞一個指向他們管理的結構體的指針,我會爲它們填充它。 – mah

+0

你爲什麼要這樣做?構造一個新的'struct s2'並返回它基本上是免費的(您已經通過值返回結構體,並因此複製它)。 – Mankarse

回答

6

不能直接返回結構,但你能避免 使用compound literal, 這是C99的功能,建立在源代碼中一個獨立的變量。

struct s2 test(void) { 
    struct s1 s = { 1, 2 }; 
    return (struct s2){s.a, s.b}; 
} 
-2

您可以通過投射返回,但不應該。

由於您確信字節將完全相同,因此在內存級別s2可以被忠實地解釋爲s1,因此投射會在此處起作用。

但是,如果有人在s2中添加了一個新字段,那麼這個字段可能會崩潰等等。從編程或軟件工程的角度來看,您應該轉換,如果您確實希望s1和s2保持兼容,則應該寫一個複製ctor或翻譯器或任何從一個到另一個。

+1

Casting引發錯誤:「使用類型'struct s2',其中需要算術或指針類型」 – rid

+1

@Radu:'return *(struct s2 *)&s;' – ouah

+1

是的,剛剛發佈ouah的行。一般來說,如果沒有給他們修改或澄清的機會,試圖回答你的問題的每個人都會失敗。 – djechlin

-1

我想你的看法是,你得到一個編譯器錯誤。 我建議你投return語句:

return (struct s2) s; 

它應該工作,本能地。如果它不是,也許你可以調整編譯器,通過使錯誤成爲警告來跳過檢查。 只是爲了好奇,你爲什麼需要這個?

+0

它不會,它會產生錯誤:「使用類型'struct s2'需要算術或指針類型」 – rid

0

除了nos答案 .. 注:對於演示只是,它不是一個答案]

這是一個真正的壞辦法做到這一點(不推薦),但它可以劣,欺騙編譯: -

struct s1 { int a; int b; }; 
struct s2 { int a; int b; }; 
struct s2 test(void) 
{ 
    struct s1 s = { 1, 2 }; 
    return *((struct s2*)(void*)&s); 
} 

它的行爲完全取決於compiler.If S1和S2排列相同的方式,然後這個工程。

相關問題