C语言 不允许使用不完整的类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 不允许使用不完整的类型相关的知识,希望对你有一定的参考价值。

还没写完,visual studio就报错了,这是怎么回事

参考技术A 就C语言来说,出现“不zd允许使用不完整信息”一般是你定义了一个结构体比如
struct

int
a;
char
b;
mystruct;
然后你在使用这个结构体给变量定义的时专候写成了这样:
mystruct
x,y;
在ANSI
C语言中这样是不属允许的(C++可以)要写成这样:
struct
mystruct
x,y;
就没有问题了。
参考技术B 下面几种表达方式是合法的:
char
**argv;
char
(*argv)[];
char
*argv[2];
你的写法等价于:
char
*(argv[]);
即定义了一个指向数组的指针,由于数组长度不确定,无法计算计算指针单位长度,因此编译器说结构定义不完整。

错误:不允许指向不完整类类型的指针。 SDL/C++

【中文标题】错误:不允许指向不完整类类型的指针。 SDL/C++【英文标题】:Error: Pointer to incomplete class type is not allowed. SDL/c++ 【发布时间】:2015-01-02 14:57:32 【问题描述】:

所以我是 SDL 的新手,在我的代码中我遇到了这个错误:

不允许使用指向不完整类类型的指针。

代码如下:

ma​​in.cpp

#include <SDL.h>
#include "events.h"

int main(int argc, char ** argv)

SDL_Renderer* ro;
SDL_Texture* to;
SDL_Surface* so;
SDL_Window* wo;


SDL_FreeSurface(so->getImage());

SDL_SetRenderDrawColor(ro->getRenderer(), 255, 255, 255, 255); // error here

// handle events

events mo;
mo.handleEvents();

// cleanup SDL

SDL_DestroyTexture(to->getTexture()); // error here
SDL_DestroyRenderer(ro->getRenderer()); // error here
SDL_DestroyWindow(wo->getWindow()); // error here
SDL_Quit();

return 0;

events.h

#pragma once
class events

public:
events();
void handleEvents();
SDL_Renderer* getRenderer();
SDL_Texture* getTexture();
SDL_Surface* getImage();
SDL_Window* getWindow();
~events();
private:
SDL_Event event;
int x;
int y;
bool quit;
SDL_Renderer *renderer;
SDL_Texture *texture;
SDL_Surface *image;
SDL_Window *window;
;

events.cpp

#include "events.h"
#include <SDL.h>


events::events()

SDL_Event event;
int x = 288;
int y = 208;
bool quit = false;
SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0);
SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, image);
SDL_Surface *image = SDL_LoadBMP("face.bmp");
SDL_Window *window = SDL_CreateWindow("SDL2 Keyboard/Mouse events", SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);



events::~events()



void events::handleEvents()

SDL_Init(SDL_INIT_VIDEO);

while (!quit)

    SDL_Delay(10);
    SDL_PollEvent(&event);

    switch (event.type)
    
    case SDL_QUIT:
        quit = true;
        break;

    case SDL_KEYDOWN:
        switch (event.key.keysym.sym)
        
        case SDLK_LEFT:
            x -= 5;
            break;
        case SDLK_RIGHT:
            x += 5;
            break;
        case SDLK_UP:
            y -= 5;
            break;
        case SDLK_DOWN:
            y += 5;
            break;
        
        break;
    

    SDL_Rect dstrect =  x, y, 64, 64 ;

    SDL_RenderClear(renderer);
    SDL_RenderCopy(renderer, texture, NULL, &dstrect);
    SDL_RenderPresent(renderer);
  


SDL_Renderer* events::getRenderer()
return renderer;


SDL_Texture* events::getTexture()
return texture;


SDL_Surface* events::getImage()
return image;


SDL_Window* events::getWindow()
return window;

【问题讨论】:

SDL_Renderer* ro; SDL_Texture* to; SDL_Surface* so; SDL_Window* wo; 都是指向可能是抽象类的未初始化指针。你不是说创建例如events ev; 然后打电话给SDL_FreeSurface(ev.getImage());? 这都是错误的。在使用 SDL 之前,您需要学习 C++ 的基础知识。在您的事件构造函数中,您将渲染器、纹理等创建为局部变量,当构造函数完成时,这些变量将超出范围。渲染器等的成员变量将未初始化。然后最重要的是,您在主函数中再次声明了它们,但从未为它们分配任何东西,并且正在从它们调用甚至不存在的函数。 【参考方案1】:

编译 events.cpp 时出现该错误,因为 events.h 在使用 SDL 数据类型之前不包含 SDL.h。然后在events.cpp 中,SDL.h 包含在events.h 之后,因此会出现错误。

【讨论】:

以上是关于C语言 不允许使用不完整的类型的主要内容,如果未能解决你的问题,请参考以下文章

不允许使用不完整的类型 c语言

c语言报错不允许使用不完整类型,让用户自定义数组大小。

用VS15编写多文件程序的时候,c语言提示不允许使用不完整的类型

C语言不允许使用不完整的类型报错是啥意思啊

c++mfc为何报错不允许指针指向不完整的类类型?

c语言中,定义数组和引用数组时,其数组的下标的数据类型分别允许是啥?