반환 할 구조체는 익명 구조체가 아닙니다. C 표준은 익명 구조체를 태그를 사용하지 않는 다른 구조체의 멤버로 정의합니다. 반환하는 것은 태그가없는 구조체이지만 멤버가 아니기 때문에 익명이 아닙니다. Gcc는 이름이 < 익명>을 사용하여 태그가없는 구조체를 나타냅니다.
함수에서 동일한 구조체를 선언하려고한다고 가정 해 보겠습니다.
struct { int x, y; } foo(void)
{
return (struct { int x, y; }){ 0 } ;
}
GCC는 그것에 대해 불평 : 호환되지 않는 유형의 유형을 반환 '> < 익명 구조체'하지만 '구조체는 < 익명>은'
이 분명히 종류가 호환되지 않습니다 예상했다.
6.2.7 지원되는 유형과 복합 형이
1 : 자신의 종류가 같은 경우 두 가지 유형이 호환되는 유형이 표준에서 보면 우리는 것을 알 수있다. 두 유형이 호환되는지 여부를 판별하기위한 추가 규칙은 유형 지정자의 경우 6.7.2, 유형 규정 자의 경우 6.7.3, 선언자의 경우 6.7.6에 설명되어 있습니다. 또한 별도의 번역본 인 단위로 선언 된 두 개의 구조체, 공용체 또는 열거 형은 해당 태그와 멤버가 다음 요구 사항을 충족시키는 경우 호환됩니다. 태그로 선언 된 경우 다른 태그와 동일한 태그로 선언해야합니다.두 번역 단위 모두 해당 번역 단위 내에서 완성 된 경우 다음 추가 요구 사항이에 적용됩니다. 해당 구성원의 각 쌍이 호환 가능한 형식으로 선언되도록 해당 구성원간에 일대일 대응이 있어야합니다. 한 쌍의 멤버가 정렬 지정자로 선언되면 다른 멤버는 동등한 정렬 지정자로 선언됩니다. 한 쌍의 멤버가 이름으로 선언되면 다른 멤버는 같은 이름으로 선언됩니다. 두 구조체의 경우, 대응하는 멤버는 같은 순서로 선언되어야한다. 2 개의 구조체 또는 공용체의 경우, 대응하는 비트 필드는 같은 폭을 가져야한다. 2 개의 열거 형의 경우, 대응하는 멤버는 같은 값을 가져야한다.
두 번째 굵은 부분은 구조체에 태그가없는 경우 (예 :이 예와 같이) 해당 부분에 나열된 추가 요구 사항을 따라야한다고 설명합니다. 그러나 첫 번째 굵은 글씨 부분을 별도의 번역 단위로 사용해야 할 경우이 예제의 구조체는 그렇지 않습니다. 그래서 그들은 호환되지 않으며 코드는 유효하지 않습니다.
:
당신이 구조체를 선언하고이 함수를 사용하는 경우, 당신은 두 구조체가 같은 태그가 있어야이 규칙을 위반하는 태그를 사용할 필요가 있기 때문에 코드가 정확한지 확인하는 것은 불가능합니다
struct t { int x, y; } ;
struct { int x, y; } foo(void)
{
struct t var = { 0 } ;
return var ;
}
다시 한번의 GCC는 불평 : 호환되지 않는 유형의 유형 '구조체 t'만 반환 할 때 '구조체를 < 익명>'
는 것 같다가 오류를주고 엄격한 gcc.With C99의 일부 해킹 http://ideone.com/665vM2 – Ankur
@Shan : 함수 정의 구문은 여전히 유효합니다. 단순히 누락 된 return 문에 대해 불만을 토로합니다 (이 상황에서 올바른 return 문을 수행하는 방법은 묻습니다). – Askaga
C99에는 익명 구조체와 같은 것이 없습니다. _compound 리터럴 _을 만들 수는 있지만 항상 로컬 범위가 있습니다. – Lundin