ref(stderr in(old)C代码生成错误

时间:2013-07-09 10:07:47

标签: c compiler-errors cygwin gnu legacy

我正在尝试编译一些C代码(写于1993年),并解决了一些轻微的皱纹,但我被困在一个(15/16对象编译与2个小调整)。这是给我发错误的代码:

#include "diagmesg.h"
#include <string.h>
#include <stdlib.h>

/* Definition of global variables */
FILE *  error_fp = stderr;

这是diagmesg.h:

#ifndef DIAGMESG_H
#define DIAGMESG_H
#include <stdio.h>

/* extern int fprintf(); CHANGE 9/3 */

/* Global types */
/* Possible settings for the Diagnostic Reporting Level */
enum Diagnostic_Level   { NONE, ERROR, INFORM, DEBUG };

/* Declaration of global variables */
extern enum Diagnostic_Level    current_level;
extern FILE         *error_fp;

/* macros for doing Diagnostic Report */
#define ERROR_MSG( s )\
do{ if ( current_level >= ERROR  ) fprintf( error_fp, "(e)   %s\n", s); }while(0)
#define INFORM_MSG( s )\
do{ if ( current_level >= INFORM ) fprintf( error_fp, "(i)   %s\n", s); }while(0)
#define DEBUG_MSG( s )\
do{ if ( current_level >= DEBUG  ) fprintf( error_fp, "(d)   %s\n", s); }while(0)

/* buffer control */
#define BUFFER_BLOCK 32

extern void Buffer_MSG( enum Diagnostic_Level, char *);
extern void Flush_MSG( void );
#endif

这是来自编译器的(相关)消息:

GNU C (GCC) version 4.5.3 (i686-pc-cygwin)
        compiled by GNU C version 4.5.3, GMP version 4.3.2, MPFR version 3.0.1-p4, MPC version 0.8
warning: MPFR header version 3.0.1-p4 differs from library version 3.1.2.
GGC heuristics: --param ggc-min-expand=99 --param ggc-min-heapsize=129520
ignoring nonexistent directory "/usr/local/include"
ignoring nonexistent directory "/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../i686-pc-cygwin/include"
ignoring duplicate directory "/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../i686-pc-cygwin/lib/../../include/w32api"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/i686-pc-cygwin/4.5.3/include
 /usr/lib/gcc/i686-pc-cygwin/4.5.3/include-fixed
 /usr/include
 /usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../include/w32api
End of search list.
GNU C (GCC) version 4.5.3 (i686-pc-cygwin)
        compiled by GNU C version 4.5.3, GMP version 4.3.2, MPFR version 3.0.1-p4, MPC version 0.8
warning: MPFR header version 3.0.1-p4 differs from library version 3.1.2.
GGC heuristics: --param ggc-min-expand=99 --param ggc-min-heapsize=129520
Compiler executable checksum: 89d6774c1d510265da7d48b735ce61fb
diagmesg.c:17:1: error: initializer element is not constant
Makefile:101: recipe for target `diagmesg.o' failed
make: *** [diagmesg.o] Error 1

源代码中的第17行是上面显示的FILE * error_fp = stderr;语句

我不是常规的C程序员。如果任何人都可以澄清“初始化元素不是常量”的意思和/或编译的可能解决方案将非常感谢。

3 个答案:

答案 0 :(得分:2)

由您的系统决定stderr是如何定义的,但在大多数情况下,它将是一种变量,不能用于在全局变量的声明中初始化error_fp。在您的代码中完成。您可以做的是在您第一次使用error_fp之前在代码中找到一个位置(通过直接使用..._MSG()宏来调用它)并在那里初始化它(例如在您的{ {1}}功能)。

编辑:仅仅是为了好奇:我只是做了一个简短的测试,可以在两个不同的solaris系统和AIX上编译和运行代码,但不能在Linux上运行

答案 1 :(得分:1)

系统库给出了stderr的定义,它不是常量。将stderr分配给需要常量初始值设定项的全局变量error_fp时会出现问题。

作为解决方案,您可以直接在printf中使用stderr,如:

fprintf( stderr, "(e)   %s\n", s);

答案 2 :(得分:1)

这是系统库的一个问题。系统库提供的文件提供了stderr的定义,它不是常量。

早些时候(我的意思是在旧图书馆中)stderr被赋予#define stderr _IO_stderr,现在它是extern FILE *stderr。 已经存在一些解决方法,例如使用自定义stdio.h。有关详细信息refer this