3

私はいくつかの C コード (1993 年に書かれたもの) をコンパイルしようとしていて、いくつかの小さなしわを解決しましたが、1 つ (2 つの小さな調整でコンパイルされた 15/16 オブジェクト) で行き詰っています。エラーを送信するコードは次のとおりです。

#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 プログラマーではありません。「イニシャライザ要素が定数ではない」の意味を誰かが明確にできる場合、および/またはコンパイルの可能な解決策があれば、非常に感謝します。

4

3 に答える 3

1

システム ライブラリは、定数ではない stderr の定義を提供しています。定数初期化子が必要stderrなグローバル変数に代入すると問題になります。error_fp

解決策として、次のように printf で stderr を直接使用できます。

fprintf( stderr, "(e)   %s\n", s);
于 2013-07-09T10:36:35.843 に答える
1

これはシステム ライブラリの問題です。システム ライブラリによって提供されるファイルは、定数ではない stderr の定義を提供しています。

以前は (古いライブラリを意味します) stderr は as として指定され#define stderr _IO_stderrていましたが、現在は ですextern FILE *stderr。カスタム stdio.h を使用するなど、いくつかの回避策が既に存在します。詳細については、これを参照してください

于 2013-07-09T10:38:36.137 に答える