【问题标题】:Initializer is not a constant error初始化器不是一个恒定的错误
【发布时间】:2012-05-09 18:40:17
【问题描述】:

很抱歉,如果这个问题被反复询问,但我只是不明白这段 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 应用程序,但它没有正确设置路径。我必须使用配置才能使其正常工作,但无论如何谢谢!

【问题讨论】:

  • 因为 conio2.h 不是编译器库,而是用户制作的头文件,包括它使用 #include "conio2.h"。但是,这不太可能是错误的原因。
  • 如果你用/P进行预处理并查看生成的.i文件中的函数是否有任何线索?

标签: c visual-c++ console


【解决方案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 吗?

【讨论】:

  • Header: Wincon.h (include Windows.h) 我确实包含它,在文件的开头。
  • 编辑:即使删除 ifndef 并以纯粹粗暴的方式包含 windows.h,我仍然会遇到同样的错误
  • 对#include 的防护是不必要的,所以删除它。 Windows.h 应该有自己的标头保护。
【解决方案2】:

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

【讨论】:

  • 链接非常适合提供参考和归属,但它们本身会导致糟糕的答案。能否请您同时引用相关材料,以便答案不言自明?
  • int 书面 = 0; // 这不是常数!?我的意思是,zero 不是一个常数值吗!?
  • 恕我直言,这个链接有完全相同的错误,为什么会抛出这个错误以及一些显示问题的例子。这是不言自明的。我在链接中没有看到任何不相关的内容。
  • 这段代码中的所有例子都是自动的,只有“Written”被初始化为一个常量。所以链接似乎与错误无关。另外,链接上的代码似乎不正确,2.0 - 1.0 应该被预处理为常量1.0
【解决方案3】:

您的代码有几个预处理器异常。以下代码在 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"

【讨论】:

  • 哦,对不起,不是怪事。守卫是要确保 windows.h 被包含在内,因为我将它包含在某些文件中,但没有包含在其他文件中,并且它被搞砸了,所以我想了一种方法来清理只更改头文件的方法。另外,conio2.h is 在编译器的包含路径中,所以我真的更喜欢使用 :)
猜你喜欢
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 2012-12-03
  • 2020-08-14
  • 1970-01-01
  • 2012-04-10
相关资源
最近更新 更多