2009-01-15 32 views
1

我得到如下因素误差下面的代码, “1506-221(S)初始化必须是有效的常量表达式”问题与文件

FILE   *fp[] = {stdout, dump_f}; 

这是可以接受的?达到这个目标的正确方法是什么?

回答

4

错误表明在您的系统上,stdout变量实际上是一个#defined宏,它扩展为函数调用。

实际上,正如其他人所说,它可能只是stdout是一个extern声明的变量,其值在编译时不知道,因此无法在静态初始化程序中提供。

这不管,解决方案应该是相同的 - 我想尝试这样的:

FILE *fp[2]; 

void init_fp() 
{ 
    fp[0] = stdout; 
    fp[1] = dump_f; 
} 
+0

宏将如何影响结果? – strager 2009-01-16 00:22:03

2

如果这是一个全球性的,那么C不支持函数调用初始化。如果stdout是一个函数调用的宏(如最初建议的那样),那么您将无法使用它来初始化全局。

2

很可能,stdout和/或dump_f是宏或外部全局变量(更可能是问题)。

如果我有这样的代码:

// external.c 
int hello = 1234; 

// external.h 
extern int hello; 

// main.c 
#include "external.h" 

int world = hello; // error! 

您将在指定的行收到一个错误,因为hello值是不知道。

stdoutdump_f最有可能声明为extern全局变量,像这样:

extern FILE *stdout, *stdin, *stderr, *dump_f; 
2

传统上,用于定义作为stdout类似(&_iob[1]),从而减少了一个有效的常量表达式最Unix系统;例如,Solaris仍然如此。

几年前,现在,GNU C Library将其定义stdout更改为非常量,因此用于初始化任何标准文件指针的旧代码已停止编译。这是由C标准认可的,所以没有抱怨的美德。您只需接受不能将静态文件指针初始化为其中一个标准I/O通道并重新编码以解决该问题。 (但它仍是一个滋扰。)

+0

又一个令人讨厌FSF的原因。 – 2009-01-16 01:16:42