Xref: utzoo gnu.gcc:255 comp.os.vms:12507 comp.lang.c:16830 Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!ames!xanth!uunet!munnari!mimir!hugin!augean!sirius!eco!nt!levels!ccdn From: ccdn@levels.sait.edu.au (DAVID NEWALL) Newsgroups: gnu.gcc,comp.os.vms,comp.lang.c Subject: Problems with GCC and/or VAX LINK Summary: GCC has problems with quotes ('). VAX LINK has problems with extern Keywords: globalref, extern, quotation marks Message-ID: <1680@levels.sait.edu.au> Date: 8 Mar 89 14:44:41 GMT Organization: Sth Australian Inst of Technology Lines: 57 I recently tried compiling the VAX LZCMP compression program on our VAX. The VAX is running VMS 5.0 and the C compiler is GNU C (don't know what version). I encountered a few problems: 1. GCC doesn't allow mismatched quotation marks. For example: /* this isn't going to work */ doesn't compile because the comment has a single quotation mark. Interestingly, the following does compile: /* this is going to work, even though the quotes (') aren't matched on the _same_ line */ I think this behaviour is poor -- quotes shouldn't need to be matched in comments. Neither should they need matching in code that is #ifdef'd out. I've seen arguments over this behaviour before (some people claim it is the one true way; others disagree). For the record, I think that comments are just that: comments. And so it shouldn't matter how many quotation marks they contain. Code which is #ifdef'd out should be treated similarly. I'd like this problem fixed. (Please). 2. The LZCMP program includes a DCL command table, which is generated by the VMS command "$ SET COMMAND/OBJECT". This command table is linked with the C program, and referenced (in the program) via a "globalref" variable; the declaration looks like this: globalref dcl_table; /* this is the DCL command table */ I assumed that "globalref" meant the same as "extern". This turns out not to be the case. It seems that VMS has a "global" class for symbols, and that extern variables aren't "global". It also turns out that extern functions _are_ global -- what I am saying is that "extern dcl_table" didn't work (dcl_table didn't point to the right place), but "extern dcl_table()" did! How do I reference (VAX) global symbols from a C program, assuming I want to compile with GCC? 3. My investigations into "globalref" high-lighted a problem with either the VMS linker, or with both GCC and VAX C. Essentialy, I can compile, link and execute the following program: extern v1; int v2; main() { printf("&v1=%d\n&v2=%d\n", &v1, &v2); exit(1); } Compiling with GCC, I get &v1 == &v2. Compiling with VAX C I get &v1 + 4 == &v2. In either case, I think it's wrong. I think that I should get a linker error complaining about an undefined external variable (v1). Aren't I right? Shouldn't the above program generate an error? In which case, is this a bug in GCC (and VAX C) or in the VAX linker? (I think it's a fault of the linker). David Newall Phone: +61 8 343 3160 Unix Systems Programmer Fax: +61 8 349 6939 Academic Computing Service E-mail: ccdn@levels.sait.oz.au SA Institute of Technology Post: The Levels, South Australia, 5095