我得到如下因素误差下面的代码, “1506-221(S)初始化必须是有效的常量表达式”问题与文件
FILE *fp[] = {stdout, dump_f};
这是可以接受的?达到这个目标的正确方法是什么?
我得到如下因素误差下面的代码, “1506-221(S)初始化必须是有效的常量表达式”问题与文件
FILE *fp[] = {stdout, dump_f};
这是可以接受的?达到这个目标的正确方法是什么?
错误表明在您的系统上,stdout
变量实际上是一个#defined
宏,它扩展为函数调用。
实际上,正如其他人所说,它可能只是stdout
是一个extern声明的变量,其值在编译时不知道,因此无法在静态初始化程序中提供。
这不管,解决方案应该是相同的 - 我想尝试这样的:
FILE *fp[2];
void init_fp()
{
fp[0] = stdout;
fp[1] = dump_f;
}
如果这是一个全球性的,那么C不支持函数调用初始化。如果stdout
是一个函数调用的宏(如最初建议的那样),那么您将无法使用它来初始化全局。
很可能,stdout
和/或dump_f
是宏或外部全局变量(更可能是问题)。
如果我有这样的代码:
// external.c
int hello = 1234;
// external.h
extern int hello;
// main.c
#include "external.h"
int world = hello; // error!
您将在指定的行收到一个错误,因为hello
值是不知道。
stdout
和dump_f
最有可能声明为extern
全局变量,像这样:
extern FILE *stdout, *stdin, *stderr, *dump_f;
传统上,用于定义作为stdout
类似(&_iob[1])
,从而减少了一个有效的常量表达式最Unix系统;例如,Solaris仍然如此。
几年前,现在,GNU C Library将其定义stdout
更改为非常量,因此用于初始化任何标准文件指针的旧代码已停止编译。这是由C标准认可的,所以没有抱怨的美德。您只需接受不能将静态文件指针初始化为其中一个标准I/O通道并重新编码以解决该问题。 (但它是仍是一个滋扰。)
又一个令人讨厌FSF的原因。 – 2009-01-16 01:16:42
宏将如何影响结果? – strager 2009-01-16 00:22:03