gpt4 book ai didi

c - 在(旧)C 代码中引用 stderr 会产生错误

转载 作者:行者123 更新时间:2023-12-02 10:40:49 25 4
gpt4 key购买 nike

我正在尝试编译一些 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 程序员。如果有人能阐明“初始化器元素不是常量”的含义和/或可能的编译解决方案,将不胜感激。

最佳答案

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

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

关于c - 在(旧)C 代码中引用 stderr 会产生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17545523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com