포인터 - C에서 빈 구조체의 크기는 얼마입니까?



쉽게 풀어쓴 c언어 express 13장 exercise (3)

C 문법은 struct 의 내용이 비어있는 것을 허용하지 않습니다. 적어도 이름없는 비트 필드 또는 명명 된 멤버가 있어야합니다 (문법이 관련된 한 - 그렇지 않으면 명명되지 않은 비트 필드가 유효합니다).

C에서 빈 구조체에 대한 지원은 GCC의 확장입니다 .

C ++과 빈 구조체 / 클래스 멤버 사양은 명시 적으로 허용되지만 크기는 1로 정의됩니다. 빈 기본 최적화의 일부로 컴파일러에서 빈 기본 클래스가 파생 클래스에 공백을 두지 않으면 예외입니다.

https://src-bin.com

나에 따르면, 그것은 제로이지만 약간의 혼란이 here 에있는 것처럼 보입니다.

나는 gcc 컴파일러로 테스트했고 출력으로 제로를 준다. C ++에서는 빈 클래스의 크기가 1이라는 것을 알고 있습니다. 여기에 아무것도없는 경우 알려주십시오.


Answer #1

C99 : "struct-declaration-list에 명명 된 멤버가 없으면 동작이 정의되지 않았습니다."

구문은 실제로 어쨌든 허용하지 않습니다. 진단이 필요하다는 것을 알지 못하지만 "정의되지 않은 동작"캠프에 꽤 많이 반영됩니다.


Answer #2

구조체는 C에서 그 구조체가 그것을 금지하기 때문에 비워 둘 수 없다. 게다가 구조체에 이름있는 멤버가 없으면 동작을 정의하지 못하게하는 의미 적 제약이 있습니다.

struct-or-union-specifier:
  struct-or-union identifieropt { struct-declaration-list }
  struct-or-union identifier

struct-or-union:
  struct
  union

struct-declaration-list:
  struct-declaration
  struct-declaration-list struct-declaration

struct-declaration:
  specifier-qualifier-list struct-declarator-list ;

/* type-specifier or qualifier required here! */
specifier-qualifier-list:
  type-specifier specifier-qualifier-listopt
  type-qualifier specifier-qualifier-listopt

struct-declarator-list:
  struct-declarator
  struct-declarator-list , struct-declarator

struct-declarator:
  declarator
  declaratoropt : constant-expression

당신이 쓰는 경우

struct identifier { };

구문 규칙을 위반하기 때문에 진단 메시지가 나타납니다. 당신이 쓰는 경우

struct identifier { int : 0; };

그런 다음 명명 된 멤버가없는 비어 있지 않은 구조체를 가지므로 동작을 정의되지 않고 진단을 요구하지 않습니다.

struct-declaration-list에 명명 된 멤버가 없으면 동작이 정의되지 않습니다.

유연한 배열 멤버가 첫 번째 멤버가 될 수 없으므로 다음 사항이 허용되지 않습니다.

struct identifier { type ident[]; };




compiler-construction