<2022-01-19 周三>
如何隐藏结构体中的成员及C2027
和C2037
错误
在开发过程中遇到了error C2037
这个编译错误,今天有空把当时的环境重现一下:
// pixel.h
#pragma once
#include "forward.h"
typedef _CacheInfoPtr_ Cache;
// pixel.c
#include "pixel.h"
typedef struct _CacheInfo
{
/* Image width */
unsigned long columns;
/* Image height */
unsigned long rows;
/* Unique number for structure validation */
unsigned long signature;
} CacheInfo;
// forward.h
#pragma once
typedef struct _CacheInfo* _CacheInfoPtr_;
// t_error_c2037.cpp
#include "forward.h"
#include <stdlib.h>
#include <stdio.h>
int main()
{
_CacheInfoPtr_ p;
// use .cpp: error C2027: use of undefined type '_CacheInfo'
// use .c : error C2037: left of 'rows' specifies undefined struct/union '_CacheInfo'
// p = (_CacheInfoPtr_)malloc(sizeof(_CacheInfo));
p = (_CacheInfoPtr_)malloc(sizeof(long) * 3);
// use .cpp: error C2027: use of undefined type '_CacheInfo'
// use .c : error C2037: left of 'rows' specifies undefined struct/union '_CacheInfo'
// printf("%d\n", p->rows);
}
解释:
- 结构体
CacheInfo
的真正定义位于pixel.c
中,而非pixel.h
中。 - 真正被使用的结构体类型是
_CacheInfoPtr_
,它位于forward.h
中,这也是对外被包含的头文件。 - 在主函数中只知道
_CacheInfoPtr_
是一个结构体类型,而无法得知它的具体定义。 - 结构体
_CacheInfoPtr_
内的成员变量只能在pixel.c
中被使用。
为什么会有两个错误码:
.cpp
时编译错误是C2027
。.c
编译错误是C2037
。
上述代码你会发现无论你怎么改,你只能使用_CacheInfoPtr_
这个类型,且不能操作任何成员,这肯定是为了防止在pixel.c
之外的地方再去操作结构体,这真是一个骚操作。