La struttura che stai restituendo non è una struttura anonima. Lo standard C definisce una struttura anonima come membro di un'altra struttura che non utilizza un tag. Quello che stai restituendo è una struttura senza tag, ma dal momento che non è un membro, non è anonimo. Gcc utilizza il nome < anonimo> per indicare una struttura senza tag.
Diciamo che si tenta di dichiarare una struttura identica nella funzione.
struct { int x, y; } foo(void)
{
return (struct { int x, y; }){ 0 } ;
}
gcc si lamenta: tipi incompatibili In caso di restituzione di tipo 'struct < anonima>' ma 'struct < anonima>' era previsto
A quanto pare i tipi non sono compatibili. Guardando nello standard vediamo che:
6.2.7 tipo compatibile e tipo composito
1: Due tipi hanno tipo compatibile se i loro tipi sono gli stessi. Ulteriori regole per determinare se due tipi sono compatibili sono descritti in 6.7.2 per gli specificatori di tipi, in 6.7.3 per i qualificatori di tipi e in 6.7.6 per i dichiaratori. Inoltre, due tipi di struttura, unione o enumerazione dichiarati in unità di traduzione separata sono compatibili se i tag e i membri soddisfano i seguenti requisiti: Se uno viene dichiarato con un tag, l'altro deve essere dichiarato con lo stesso tag.Se entrambi sono completati in qualsiasi punto all'interno delle rispettive unità di traduzione, si applicano i seguenti requisiti aggiuntivi: deve esserci una corrispondenza uno a uno tra i membri in modo tale che ciascuna coppia di membri corrispondenti sia dichiarata con tipi compatibili; se un membro della coppia è dichiarato con un identificatore di allineamento, l'altro è dichiarato con un identificatore di allineamento equivalente; e se un membro della coppia è dichiarato con un nome, l'altro è dichiarato con lo stesso nome. Per due strutture, i membri corrispondenti devono essere dichiarati nello stesso ordine. Per due strutture o unioni, i campi di bit corrispondenti devono avere le stesse larghezze. Per due enumerazioni, i membri corrispondenti devono avere gli stessi valori.
La seconda parte in grassetto, spiega che se entrambe le struct sono prive del tag, come in questo esempio, devono seguire i requisiti aggiuntivi elencati in seguito a tale parte, cosa che fanno. Ma se noti la prima parte in grassetto che devono essere in unità di traduzione separate, le strutture nell'esempio non lo sono. Quindi non sono compatibili e il codice non è valido.
E 'impossibile per rendere il codice corretto in quanto se si dichiara una struct e utilizzarlo in questa funzione, è necessario utilizzare un tag, che viola la regola che entrambi hanno le strutture devono avere lo stesso tag:
struct t { int x, y; } ;
struct { int x, y; } foo(void)
{
struct t var = { 0 } ;
return var ;
}
Ancora gcc si lamenta: tipi incompatibili quando il tipo 'struct t' ma tornando 'struct < anonima>' che ci si aspettava
sembra che un po 'di hack di gcc.With C99 rigorosa sta dando l'errore http://ideone.com/665vM2 – Ankur
@Shan: la sintassi della definizione della funzione è ancora legale. Si lamenta semplicemente della dichiarazione di reso mancante (e la mia domanda chiede come eseguire una dichiarazione di reso corretta in questa situazione). – Askaga
Non esistono strutture anonimo nel C99. Puoi creare _compiuti letterali_ ma hanno sempre un ambito locale. – Lundin