2012-05-09 35 views
2

对不起,如果这已被反复询问,但我只是没有得到这个C代码有什么问题,因为它编译没有问题,直到有一天它开始抱怨“C2009:初始化器不是一个常量“在这个头的第9和第10行:初始化程序不是一个常量错误

// 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> 

编辑:我发现错误。我使用Eclipse CDT插件来开发C应用程序,但它没有正确设置路径。我不得不使用配置来使它工作,但无论如何感谢!

+0

由于conio2.h不是一个编译器库,而是一个用户自制的头文件,包括它使用'#include“conio2.h”'。但是,这不太可能是错误的原因。 – Lundin

+0

如果使用'/ P'预处理并查看生成的.i文件中的函数,是否有任何线索? –

回答

0

此链接描述了一些错误以及一些示例。它可以帮助你。根据链接,编译器在程序开始时初始化非自动变量,并且它们初始化的值必须保持不变。 http://msdn.microsoft.com/en-us/library/t801az8a(v=vs.80).aspx

+0

链接非常适合提供参考和归因,但是可以为自己提供差的答案。你是否也引用了相关材料,以便答案能够独立存在? – luke

+0

int Written = 0; //不是那么恒定!?我的意思是,不是*零*是一个常数值!? –

+0

恕我直言,这个链接有完全相同的错误,为什么会引发这个错误和一些示例显示的问题。这是自我解释。我没有看到任何不相关的链接。 –

1
COORD ord; 

你缺少COORD类型别名的定义。我的猜测是你不包括正确的头:Wincon.h

看到这里的要求(要包含的头)使用COORD类型别名: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682119(v=vs.85).aspx

编辑:而且你似乎有一个问题与您的#ifndef指令:有两个#ifndef但您的标头中只有一个#endif。对于每个#ifndef,您需要一个#endif。你确定只有当_WINDOWS_没有被定义时,你才会包含windows.h

+0

头文件:Wincon.h(包括Windows.h) 我确实包含它,在文件的开始。 –

+0

编辑:甚至删除ifndef的和包括windows.h以纯粹和粗糙的方式,我仍然得到相同的错误 –

+0

警惕#包括是没有必要的,所以删除它。 Windows.h应该有它自己的标头警卫。 – Lundin

0

您的代码有几个预处理器怪异。以下代码适用于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" 
+0

哦,对不起,并不奇怪。警卫是要确保包含windows.h,因为我将它包含在某些文件中,但没有包含在其他文件中,并且它变得混乱起来,所以我通过一种方法来清理只更改头文件。另外,conio2.h **在编译器的include路径中是**,所以我真的更喜欢使用 :) –