Mailing Lists: Apple Mailing Lists

Image of Mac OS face in stamp
 
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: extern "C" and global variables



Rush:

Thanks for considering my problem.

>John Weeks wrote:
>> Hi, folks.
>>
>> I have a C++ source file that defines a global variable:
>>
>> extern "C" unsigned char gSuppressLiveUpdate = 0;
>>
>> so that it can be used from a C source file. In the C file, of course, I
>>have
>>
>> extern unsigned char gSuppressLiveUpdate;
>>
>> gcc complains (OK, it's just a warning):
>>
>> warning: 'gSuppressLiveUpdate' initialized and declared 'extern'
>>
>> I guess I see the point of the warning; it's not really extern because it
>> is being defined right there. But then, how do I prevent name mangling so
>> that it can be used in the C file, without using the "extern" keyword?
>>
>> At the moment I have suppressed the warning by defining and initializing it
>> in the C file and using just extern "C" unsigned char gSuppressLiveUpdate;
>> in the C++ file. But that's not satisfying; I want to be able to put the
>> definition where I want it.
>>
>> CodeWarrior and VC++.net are both OK with this, but I realize that gcc is
>> actually more standards-compliant that they are. I tried searching for an
>> answer with Google, but all the discussions are about functions declared
>> extern "C".
>>
>
>It would be "more standard" to move the declaration to the corresponding
>header file, i.e.
>extern "C" unsigned char gSuppressLiveUpdate;
>
>and keep the definition in the C++ file, i.e.
>unsigned char gSuppressLiveUpdate = 0;
>
>This should take away the warning, and shouldn't have any effect on the
>C file, since it's doing its own declaration. (But it should read a
>header that contains this declaration. Really it should read the same
>header as the C++ file. Might require some #ifdef hanky panky, or just a
>globals.h file that's included both places.)
>
>- Rush

I agree that the use of header files here is not up to snuff wrt usual
practice.

What you are saying is essentially the same as (except for re-organizing
the header files):

extern "C" unsigned char gSuppressLiveUpdate;
unsigned char gSuppressLiveUpdate = 0;

and, in fact, that fixes the problem. Looks odd, though.

I guess the confusion comes from the fact that C++ is using "extern" to
mean something slightly different from what C means. But it's only
different when it is extern "C"; C++ uses extern just like C otherwise!

Thanks again!

Regards,
John Weeks

WaveMetrics, Inc.
Phone (503) 620-3001
Fax   (503) 620-6754
email   email@hidden

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Xcode-users mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/xcode-users/email@hidden

This email sent to email@hidden

References: 
 >extern "C" and global variables (From: John Weeks <email@hidden>)
 >Re: extern "C" and global variables (From: Rush Manbert <email@hidden>)



Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Contact Apple | Terms of Use | Privacy Policy

Copyright © 2007 Apple Inc. All rights reserved.