【问题标题】:Code doesn't compile: error C2099: initializer is not a constant代码无法编译:错误 C2099:初始化程序不是常量
【发布时间】:2014-12-20 12:53:26
【问题描述】:

我正在尝试让最初用 C 编写的软件在 Visual C++ 中编译。这是我到目前为止的代码:

#include "timer.h"

FILE * timerFP = stdout;

int timerCount = 0;

double time_Master = 0.0;
static tsc_type tsc_Master;

void Timer_Start(void)
{
    readTSC(tsc_Master);
}

void Timer_Stop(void)
{
    tsc_type tsc_Master2;
    readTSC(tsc_Master2);
    time_Master += diffTSC(tsc_Master,tsc_Master2);
}

但是 Visual C++ 给了我以下错误:

error C2099: initializer is not a constant.

我该如何解决这个问题?谢谢你。

【问题讨论】:

  • 指向的完整错误信息(包括行号和类似信息)是什么?
  • 很确定是这一行:FILE * timerFP = stdout;
  • 它指向'FILE * timerFP = stdout;'行
  • 将标签从 [C++] 更改为 [C]。代码在 [C++] 中工作,即使它是无效的 [C]
  • 变量 timerFP 没有被使用,所以你可以去掉那一行。 stdout 直到运行时才设置,因此它的内容直到运行时才知道。

标签: c


【解决方案1】:

can't initialize a global variable with a non-constant valuestdout。您需要在 main 函数中执行此操作(或任何适合您目的的初始化函数):

FILE *timerFP;

int main(void) {
    timerFP = stdout;
    /* ... */
}

或者,您可以将其定义为函数:

FILE *timerFP(void) {
    return stdout;
}

典型的编译器可以很容易地优化函数调用。

【讨论】:

    【解决方案2】:

    正如评论者已经指出的那样,stdout 不需要是常量。例如,在 MSVC++ 2013 中,%PROGRAMFILES(x86)%\Microsoft Visual Studio 12.0\VC\include\stdio.h 的第 150 行是这样定义的:

    #define stdout (&__iob_func()[1])
    

    这意味着它涉及一个函数调用。初始化器需要是编译时常量,stdout 不是。

    (注意这在不同版本的MSVC++之间会有所不同,所以你的版本可能会有所不同)

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      相关资源
      最近更新 更多