난 그냥 익명 union
의 거대한 이익에 달렸다. 그러나 이것이 희미한 마음을 가진 이야기가 아니며 권장되는 관행임을 경고하십시오.
수백 개의 소스 코드 파일로 이루어진 구형 C 프로그램에는 struct
이 구성원으로 포함 된 struct
이라는 전역 변수가 있습니다. 다른 사람이 코드가 기록 된 시점에서 STRUCTONE보다 모두 작았 그러나
typedef struct {
LONG lAmount;
STRUCTONE largeStruct; // memory area actually used for several different struct objects
ULONG ulFlags;
} STRUCTCOMMON;
struct
, STRUCTONE는 여러 대형 구조체 중 하나 : 그래서 전역 변수에 대한 형식 정의는 같은 어떤 것을 보았다. 따라서이 메모리 영역 인 largeStruct
은 union
으로 사용되고 있지만이를 나타내는 적절한 소스 문이 없습니다. 대신 다양한 struct
변수가 memcpy()
을 사용하여이 영역에 복사되었습니다.사태를 악화시키기 위해서는 때로는 전역 변수의 실제 이름을 통해, 때로는 전역 변수를 가리키는 포인터를 통해 이루어졌습니다.
일반적으로 시간이 갈수록 최근의 변경으로 인해 다른 구조체 중 하나가 최대가되었습니다. 그리고 나는이 파일이 여러 가지 별명과 함께 사용되는 곳을 찾는 백개의 파일을 살펴야 만했습니다.
그리고 익명의 노동 조합을 기억했습니다.
typedef struct {
LONG lAmount;
union {
// anonymous union to allow for allocation of largest space needed
STRUCTONE largeStruct; // memory area actually used for several different struct objects
STRUCTTHREE largerStruct; // memory area for even larger struct
};
ULONG ulFlags;
} STRUCTCOMMON;
을 그리고 모든 것을 다시 컴파일 : 그래서 나는 다음과 같은 일하기 위해 typedef
를 수정했습니다.
그래서 이제는 불행히도 기대했던 모든 소스 코드 검토 및 회귀 테스트가 더 이상 필요하지 않습니다.
이제이 글로벌 소스를 사용하여 소스를 천천히 수정하는 과정을 시작하여이 소스를 내 시간 테이블에서보다 최신 표준으로 가져올 수 있습니다.
가능한 복제본 [C11에서 유용한 익명의 구조체 및 공용체는 무엇입니까?] (http://stackoverflow.com/questions/8932707/what-are-anonymous-structs-and-unions-useful-for-in- c11) –