C 初始值设定项不是一个常量错误
很抱歉,如果有人一遍又一遍地问这个问题,但我不明白这段C代码有什么问题,因为它在编译时没有出现问题,直到有一天它开始在标题的第9行和第10行抱怨“C2009:初始值设定项不是常量”:C 初始值设定项不是一个常量错误,c,visual-c++,console,C,Visual C++,Console,很抱歉,如果有人一遍又一遍地问这个问题,但我不明白这段C代码有什么问题,因为它在编译时没有出现问题,直到有一天它开始在标题的第9行和第10行抱怨“C2009:初始值设定项不是常量”: // CONIO2.H #ifndef CONIO2_H_INCLUDED #define CONIO2_H_INCLUDED #ifndef _WINDOWS_ #include <windows.h> #endif void clrscr(void) { int Written = 0;
// CONIO2.H
#ifndef CONIO2_H_INCLUDED
#define CONIO2_H_INCLUDED
#ifndef _WINDOWS_
#include <windows.h>
#endif
void clrscr(void) {
int Written = 0;
COORD ord;
ord.X = 0;
ord.Y = 0;
FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), 32, 80 * 25, ord, &Written);
}
//MAIN.C
#include <stdio.h>
#include <conio2.h>
//CONIO2.H
#如果不包括CONIO2_H_
#定义包含的CONIO2_H_
#ifndef\u窗口_
#包括
#恩迪夫
无效CLRSC(无效){
int-writed=0;
合作组织;
ord.X=0;
ord.Y=0;
填充控制台输出字符(GetStdHandle(标准输出句柄),32,80*25,ord,并写入);
}
//MAIN.C
#包括
#包括
编辑:我发现了错误。我使用EclipseCDT插件开发C应用程序,但它没有正确设置路径。我不得不玩配置使其工作,但无论如何感谢 此链接介绍了错误以及一些示例。这可能对你有帮助。根据链接,编译器在程序开始时初始化非自动变量,并且初始化时使用的值必须是常量 您缺少
COORD
类型别名的定义。我猜您没有包括正确的标题:Wincon.h
有关使用COORD
类型别名的要求(要包括的标题),请参见此处:
编辑:此外,您的
#ifndef
指令似乎有问题:标题中有两个#ifndef
,但只有一个#endif
。对于每个#ifndef
,您需要一个#endif
。而且,您确定只在未定义\u windows\uuu
时才包含windows.h
吗?您的代码有几个预处理器异常。下面的代码在Windows标准C编译器上运行良好。请注意,VC++不是标准的C编译器,因此它可能会向您抛出各种奇怪的错误
// CONIO2.H
#ifndef CONIO2_H_INCLUDED
#define CONIO2_H_INCLUDED
#include <windows.h>
void clrscr (void)
{
DWORD Written = 0;
COORD ord;
ord.X = 0;
ord.Y = 0;
FillConsoleOutputCharacter (GetStdHandle(STD_OUTPUT_HANDLE),
32,
80 * 25,
ord,
&Written);
}
#endif /* CONIO2_H_INCLUDED */
//MAIN.C
#include <stdio.h>
#include "conio2.h"
//CONIO2.H
#如果不包括CONIO2_H_
#定义包含的CONIO2_H_
#包括
无效CLRSC(无效)
{
DWORD WRITED=0;
合作组织;
ord.X=0;
ord.Y=0;
FillConsoleOutputCharacter(GetStdHandle(标准输出句柄),
32,
80 * 25,
作战需求文件,
&书面的);
}
#endif/*CONIO2_H_包括在内*/
//MAIN.C
#包括
#包括“conio2.h”
链接很好地提供了参考和归属,但其本身却导致了糟糕的答案。请您同时引用相关材料,以便答案能够独立存在?int writed=0;//这不是常数吗!?我是说,零不是一个常量吗!?IMHO,这个链接有完全相同的错误,为什么会抛出这个错误,还有一些例子说明了这个问题。这是不言自明的。我在链接中没有看到任何不相关的东西。这段代码中的所有示例都是自动的,只有“write”被初始化为常量。因此,链接似乎与错误无关。此外,链接处的代码似乎不正确,2.0-1.0
应预处理为常量1.0
。Header:Wincon.h(包括Windows.h)我确实将其包括在文件中。edit:即使删除ifndef并以纯粹而粗糙的方式包括Windows.h,我仍然会遇到同样的错误——不需要包括在内的防范措施,所以将其删除。Windows.h应该有自己的头保护。因为conio2.h不是一个编译器库,而是一个用户制作的头文件,包括使用#include“conio2.h”
。但是,这不太可能是错误的原因。如果您使用/P
进行预处理并查看生成的.i文件中的函数,是否有任何线索?哦,对不起,不是奇怪之处。警卫要确保包含windows.h,因为我在一些文件中包含了它,但在其他文件中没有,而且它被弄乱了,所以我想了一种方法来清理它,只更改头文件。此外,conio2.h位于编译器的include路径中,因此我更喜欢使用:)
// CONIO2.H
#ifndef CONIO2_H_INCLUDED
#define CONIO2_H_INCLUDED
#include <windows.h>
void clrscr (void)
{
DWORD Written = 0;
COORD ord;
ord.X = 0;
ord.Y = 0;
FillConsoleOutputCharacter (GetStdHandle(STD_OUTPUT_HANDLE),
32,
80 * 25,
ord,
&Written);
}
#endif /* CONIO2_H_INCLUDED */
//MAIN.C
#include <stdio.h>
#include "conio2.h"