在"{"令牌之前应使用"",""或";"(C++,无效与 windows.h)

Expected `,' or `;' before '{' token (C++, void vs. windows.h)

本文关键字:无效 C++ windows 令牌      更新时间:2023-10-16

我正在拼命地制作一个头文件,其中包含在控制台中试验ASCII图形的函数。我的目标是简化windows.h的使用。我使用的是Dev-C++。

我写了一个void类型的初始化函数,通过使用参数和windows.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)

全局对象(如上面的三个)是在整个程序期间存在的对象。另一方面,参数是在函数被调用时传递到函数中的对象。你需要区分这些。函数参数在函数名称后面的括号中声明。


正如Chris在下面的评论中提到的,当你开始在多个文件中包含这个头时,你会遇到违反一个定义规则的问题。原因是包含此标头的每个文件都将尝试定义这些全局变量和函数中的每一个。这导致了C++不允许的多个定义。

相反,您的头应该包含声明,而您应该有一个.cpp文件,其中包含上面给出的定义。要将全局变量定义放入声明中,只需将extern放在它之前。要将函数定义放入声明,请去掉正文({}),并确保行以分号结束。