代码之家  ›  专栏  ›  技术社区  ›  Thi

用文件发出

  •  1
  • Thi  · 技术社区  · 17 年前

    我得到下面代码的以下错误, “1506-221(s)初始值设定项必须是有效的常量表达式”

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

    这可以接受吗?实现这一目标的正确方法是什么?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Alnitak    17 年前

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

    事实上,正如其他人所说,可能只是 标准输出 是一个外部声明变量,其值在编译时未知,因此无法在静态初始值设定项中提供。

    不管是哪一种,解决方案都应该是相同的-我会尝试如下方法:

    FILE *fp[2];
    
    void init_fp()
    {
        fp[0] = stdout;
        fp[1] = dump_f;
    }
    
        2
  •  2
  •   strager    17 年前

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

    如果我有这个代码:

    // external.c
    int hello = 1234;
    
    // external.h
    extern int hello;
    
    // main.c
    #include "external.h"
    
    int world = hello; // error!
    

    您将在指示行收到一个错误,因为 hello 尚不清楚。

    标准输出 杜普夫 最有可能被宣布为 extern 全球,就像这样:

    extern FILE *stdout, *stdin, *stderr, *dump_f;
    
        3
  •  2
  •   Jonathan Leffler    17 年前

    传统上,大多数用于定义 stdout 就像 (&_iob[1]) ,它简化为一个有效的常量表达式;例如,Solaris仍然可以。

    几年前,现在,GNUC库改变了它对 标准输出 对于一些不是常量的东西,那么旧的代码用来初始化 FILE * 停止编译任何标准文件指针的变量。这是由C标准批准的,所以抱怨是没有好处的。您只需接受,不能初始化指向某个标准I/O通道的静态文件指针,并重新编码以解决问题。(但是它 还是个麻烦。)

        4
  •  2
  •   Tim Cooper    14 年前

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