Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!think.com!compass!worley From: worley@compass.com (Dale Worley) Newsgroups: comp.lang.c Subject: Re: static, const, struct woes Message-ID: Date: 26 Jun 91 15:30:26 GMT References: <1991Jun25.170806.23639@src.honeywell.com> Sender: root@compass.com Distribution: world Organization: Compass, Inc., Wakefield, MA, U.S.A. Lines: 43 In-reply-to: engstrom@SRC.Honeywell.COM's message of 25 Jun 91 17:08:06 GMT In article <1991Jun25.170806.23639@src.honeywell.com> engstrom@SRC.Honeywell.COM (Eric Engstrom) writes: entity User_self = {1, 2}; /* D-1 */ const entity Session_self = {3, 4}; /* D-2 */ entity const Function_self = {5, 6}; /* D-3 */ entity foo1 = User_self; /* F-1 */ entity foo2 = {User_self.cid, User_self.uid}; /* F-2 */ entity foo3 = Session_self; /* F-3 */ entity foo4 = {Session_self.cid, Session_self.uid}; /* F-4 */ entity foo5 = Function_self; /* F-5 */ entity foo6 = {Function_self.cid, Function_self.uid}; /* F-6 */ What difference (if any) is there between the three lines marked D-1, D-2, and D-3? D2 and D3 define constant objects, which you aren't allowed to assign to. Why, if either D-2 or D-3 are truly legal, do the lines F-3 to F-6 all fail to compile with the following error: "initializer for static variable is not constant" Because the values of the expressions "Session_self", etc. aren't "constant expressions". In particular, to figure out what the value is, a fetch from memory would have to be done. Of course, from the code above, the compiler could figure out what the fetch would yield, but most compilers aren't that clever, and ANSI C doesn't require them to be. Note that the Sun C compiler (OS 4.1.1) gave more, and more cryptic, errors, even complaining about the "const" portion of D-1-2-3. Probably because the Sun C compiler doesn't implement 'const', and thus thinks that 'const' is an identifier that you're trying to declare. Dale Worley Compass, Inc. worley@compass.com -- BYOB if you like, but please don't let yourself go farther than you can return. Believe me, you're going to need most of those internal organs in the morning.