Ожидаемый `, 'или`;' до '{' токена (C ++, void vs. windows.h)

0

Я отчаянно пытаюсь создать файл заголовка с функциями для экспериментов с графикой ASCII в консоли. Моя цель - упростить использование windows.h. Я использую Dev-С++.

Я написал функцию инициализации типа void, которая устанавливает размер окна и экранного буфера, размер заголовка и курсора и видимость с использованием параметров и функций window.h.

#ifndef _KONGRA_H
#define _KONGRA_H
#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;
HANDLE KGconsole=GetStdHandle(STD_OUTPUT_HANDLE);

//========================================================================CURSOR
bool KGcursorvisible;
int KGcursorsize;
CONSOLE_CURSOR_INFO KGcursorstat;

//========================================================================WINDOW
int KGbuffersizex;
int KGbuffersizey;
COORD KGbuffersize;
int KGwindowsizex;
int KGwindowsizey;
SMALL_RECT KGwindowsize;
TCHAR KGconsoletitle;

void KGset(KGbuffersizex, KGbuffersizey, KGwindowsizex, KGwindowsizey, KGconsoletitle, KGcursorvisible, KGcursorsize)
{
     SetConsoleTitle(KGconsoletitle);
     KGcursorstat.dwSize=KGcursorsize;
     KGcursorstat.bVisible=KGcursorvisible;
     SetConsoleCursorInfo(KGconsole, &KGcursorstat);
     KGbuffersize={KGbuffersizex, KGbuffersizey};
     SetConsoleScreenBufferSize(KGconsole, KGbuffersize);
     KGwindowsize={0, 0, KGwindowsizex-1, KGwindowsizey-1};
     SetConsoleWindowInfo(KGconsole, TRUE, &KGwindowsize);
}

#endif

Когда весь файл включен, он продолжает давать ошибку компиляции:

24 variable or field 'KGset' declared void
25 initializer expression list treated as compound expression
25 ',' or ';' before '{' token 

Я не могу найти отсутствующий символ, поэтому возможно, что я неправильно использую заголовок.

Может быть, это не важно, но вот main.cpp:

#include <cstdlib>
#include <iostream>
#include <conio.h>
#include "kongra.h"

using namespace std;

int main(int argc, char *argv[])
{
    KGset(20, 20, 10, 30, "Hi", 1, 100);
    getch();
    return EXIT_SUCCESS;
}
  • 0
    Пожалуйста, не начинайте макрос охранника заголовка с подчеркивания. Смотрите здесь, почему .
Теги:
token
compiler-errors

1 ответ

3
Лучший ответ

По какой-то причине вы объявляете свои параметры функции вне своей функции, как если бы они были глобальными объектами. Вероятно, останутся только следующие объекты:

CONSOLE_CURSOR_INFO KGcursorstat;
COORD KGbuffersize;
SMALL_RECT KGwindowsize;

Затем вам нужно указать типы аргументов функции:

void KGset(int KGbuffersizex, int KGbuffersizey, int KGwindowsizex, int KGwindowsizey, TCHAR KGconsoletitle,  bool KGcursorvisible, int KGcursorsize)

Глобальные объекты (например, три приведенные выше) являются объектами, которые существуют в течение всей продолжительности программы. С другой стороны, параметры - это объекты, которые передаются в функцию всякий раз, когда она вызывается. Вы должны различать их. Функциональные параметры объявляются в круглых скобках после имени функции.


Как отметил Крис в комментариях ниже, у вас возникнут проблемы с нарушением правила One Definition, когда вы начнете включать этот заголовок в несколько файлов. Причина в том, что каждый файл, который включает этот заголовок, попытается определить каждую из этих глобальных переменных и функцию. Это приводит к нескольким определениям, которые C++ не позволяет.

Вместо этого ваш заголовок должен содержать декларации, в то время как у вас должен быть .cpp файл, содержащий определения, которые вы указали выше. Чтобы сделать определение глобальной переменной в объявлении, вы просто ставите перед ним extern. Чтобы сделать определение функции в объявлении, вы удаляете тело ({ to }) и убедитесь, что линия заканчивается точкой с запятой.

  • 0
    Даже эти глобальные объекты все еще особенно опасны, потому что они находятся в заголовке и могут нарушать ODR. @ user3356511, на тему плохих вещей, которые нужно помещать в заголовки, там также используются директивы и включены охранники с зарезервированными идентификаторами .
  • 0
    @ Крис Я не думал об этом. Спасибо за указание на это.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню