Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ref to stderr in (old) C code generates error

I am trying to compile some C-code (written in 1993) and ironed out a few minor wrinkles but am stuck at one (15/16 objects compiled with 2 minor tweaks). Here's the code sending me an error:

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

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

Here's 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

Here's the (relevant) message from the compiler:

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

Line 17 in the source is the FILE * error_fp = stderr; statement shown above

I am not a routine C programmer. If anyone can clarify what "initializer element is not constant" means and/or a possible solution to compile would be very thankful.

like image 934
Buck Thorn Avatar asked Dec 06 '25 23:12

Buck Thorn


1 Answers

It's up to your system how exactly stderr is defined but in most cases it will be a kind of variable and cannot be used to initialize error_fp in the declaration of a global variable the way it is done in your code. What you can do is find a place in your code before you use error_fp for the first time (by calling on of the ..._MSG() macros ore by using it directly) and initialize it there (e.g. in your main() function).

Edit: just for curiosity: I've just make a short test and could compile and run code like your's on two different solaris systems and on AIX, but not on Linux

like image 146
Ingo Leonhardt Avatar answered Dec 08 '25 13:12

Ingo Leonhardt



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!