Я отчаянно пытаюсь создать файл заголовка с функциями для экспериментов с графикой 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;
}
По какой-то причине вы объявляете свои параметры функции вне своей функции, как если бы они были глобальными объектами. Вероятно, останутся только следующие объекты:
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 }
) и убедитесь, что линия заканчивается точкой с запятой.