schmidt%crimee.ics.uci.edu@ORION.CF.UCI.EDU ("Douglas C. Schmidt") (11/27/88)
Hi, I believe the following is valid C++ code. cfront 1.2.1 accepts and executes it correctly. G++ 1.27 produces the following error message: ---------------------------------------- g++ version 1.27.0 echo use .cc filename extension! use .cc filename extension! /usr/public/lib/g++/gcc-cpp+ -v -I/cd/ua/schmidt/include/ -undef -D__GNU__ -D__GNUG__ -Dsparc -Dsun -Dunix -+ reverse_video.c /tmp/cca01184.cpp GNU CPP version 1.27.0 /usr/public/lib/g++/gcc-c++ /tmp/cca01184.cpp -quiet -dumpbase reverse_video.c -finline-functions -fmemoize-lookups -fsave-memoized -fchar-charconst -version -o /tmp/cca01184.s At top level: reverse_video.c:19: undeclared variable `MAX_SIZE' (first use here) GNU C++ version 1.27.0 (sparc) compiled by GNU C version 1.28. ---------------------------------------- However, I believe this usage of static constants is allowed. Here's the code: ---------------------------------------- #include <stream.h> int tgetent( char *bp, char *name ); char *tgetstr( char *id, char **area ); int tputs( char *cp, int affcnt, int (*outc)( int ) ); char *getlogin ( void ); int putchr( int i ) { return ( putchar(i) ); } class Inverse { private: // g++ seems to ignore this static constant declaration static const int MAX_SIZE = 1024; char sbuf [ MAX_SIZE ]; char *sp; char bp [ MAX_SIZE ]; char *so_start; char *so_end; public: Inverse ( void ): sp ( sbuf ) { if ( tgetent ( bp, getenv ( "TERM" ) ) != 1 ) { cerr << "error: termcap read failure\n",exit ( 1 ); } so_start = tgetstr ( "so", &sp ); so_end = tgetstr ( "se", &sp ); } Inverse& operator () ( char *Buf ) { tputs ( so_start, 1, putchr ); cout << Buf; tputs ( so_end, 1, putchr ); return ( *this ); } friend ostream& operator << ( ostream& s, Inverse &i ) { // dummy function ; } }; main ( int argc,char *argv[ ] ) { Inverse V; cout << "hello, you are " << V ( getlogin ( ) ) << "\n"; }