C 初始值设定项不是一个常量错误

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;

很抱歉,如果有人一遍又一遍地问这个问题,但我不明白这段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;
    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"