Как объявить в начале программы - PullRequest
0 голосов
/ 08 октября 2018

В приведенном ниже листинге попытка объявить прямоугольник "r" перед вызовом функции main () приводит к ошибке.

error: 'r' does not name a type r.x = 150;<br>

Почему после main () должно быть объявлено «r»?

#include <SDL2/SDL.h>

int main (int argc, char** argv) {
    // Creat a rect at pos ( 50, 50 ) that's 50 pixels wide and 50 pixels high.
    SDL_Rect r;
    r.x = 150;
    r.y = 150;
    r.w = 200;
    r.h = 100;

    SDL_Window* window = NULL;
    window = SDL_CreateWindow   ("SDL2 rectangle", SDL_WINDOWPOS_UNDEFINED,
                                 SDL_WINDOWPOS_UNDEFINED,
                                 640,
                                 480,
                                 SDL_WINDOW_SHOWN
    );

    // Setup renderer
    SDL_Renderer* renderer = NULL;
    renderer =  SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED);
    SDL_SetRenderDrawColor( renderer, 0, 0, 0, 255 ); // black background
    SDL_RenderClear( renderer );    // Clear winow
    SDL_SetRenderDrawColor( renderer, 0, 255, 255, 255 ); // rgba drawing color

    // Render rect
    SDL_RenderFillRect( renderer, &r );

    // Render the rect to the screen
    SDL_RenderPresent(renderer);

    // Wait for 5 sec
    SDL_Delay( 5000 );

    SDL_DestroyWindow(window);
    SDL_Quit();

    return EXIT_SUCCESS;
}

1 Ответ

0 голосов
/ 08 октября 2018
r.x = 150;

Это не декларация и не определение, а присвоение.

C не разрешает присваивания на глобальном уровне.

Вы все еще можетеопределить переменную в глобальной области видимости

#include <SDL2/SDL.h>

SDL_Rect r;

int main (int argc, char** argv) {

Каждая переменная , определенная глобально , проходит инициализацию по умолчанию:

  • целочисленные переменные установлены на 0.
  • переменные с плавающей точкой установлены на 0..
  • переменные-указатели установлены на NULL.

Более того, вы также можете инициализировать это явным образом

#include <SDL2/SDL.h>

SDL_Rect r = {1, 2, 3, 4};

int main (int argc, char** argv) {

Хотя инициализация выглядит аналогично назначению, это не то же самое (как вы уже наблюдали).

Подробнее о разнице между назначением и инициализацией здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...