<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之外的地方再去操作结构体,这真是一个骚操作。
解决C2027和C2037编译错误:隐藏结构体成员并理解typedef在C++中的作用
本文讲述了在C++开发中遇到的C2027和C2037错误,涉及结构体成员的隐藏以及typedef的作用。重点在于理解`_CacheInfoPtr_`的定义与实际使用,以防止结构体在不同源文件间的误操作。

被折叠的 条评论
为什么被折叠?



