On 14 Mar 2010, at 1:49 PM, Steve Cronin wrote:

> To Alexander:   On the suggestion of using .m and .h files:
> 
> If I use a single #include somewhere as shown below then I can within any 
> method use
> 
> extern NSString *gLeftBracket
> 
> this allows other programmers to see immediately that it is defined elsewhere 
> and I need not burden the entire class with the overhead #import the entire 
> set of these common strings.  It seems your approach require that I expose a 
> given class to the entirety of the strings declared in the .m file.  I 
> believe my solution allows a more fine grained usage of these strings….  
> Please enlighten me if I am incorrect!

Perhaps you misconceive the effect of extern declarations.

It is proposed that you define your constants (no extern) in an .m file — any 
.m file — which you won't have to #include anywhere else, because as an .m file 
it'll be compiled in its own right. It is then proposed that you have a .h file 
(call it MyAppGlobals.h) containing just this:

extern NSString * const gLeftBracket;
extern NSString * const gRightBracket;
// etc.

In any .m file in which you use any of those constants, you #import 
"MyAppGlobals.h". The "extern" keyword doesn't just tell other programmers that 
the symbols are defined and allocated elsewhere; it tells the _compiler_ that 
they are, and what type they are. This is not a burden on anything; the 
compiler and linker _need_ that information. You won't be re-reading the 
strings themselves, only the information that they exist.

As for overhead in reading MyAppGlobals.h or parsing what may be a lot of 
symbols, there isn't any worth worrying about. If the file is frequently used, 
the file system will cache it in memory. We're talking about a second over the 
course of a multi-minute build. You'd see more difference from whether the 
machine had been recently rebooted, Xcode recently started, or what other 
processes are running.

If MyAppGlobals.h is stable, you can #import it into your .pch.

You mention #include. Use #import if at all possible. It takes care of #include 
loops for you.

> But here's my real question:
> It appears that I cannot put the one and only #include CommonStrings.txt just 
> anywhere in the project.
> Some locations work fine others result in a 'CommonStrings.tx.' - no such 
> file error.
> I'm just cutting and pasting the #include statement - so I'm not munging the 
> statement.
> I cannot see any rhyme or reason on where it works and where it doesn't…
> Can someone clarify this for me?
> Kochan ObjC2 p209 clearly states, "…variable must be defined someplace among 
> your source files…"

I'm not sure what you mean by this. Do you mean that the compiler issues a 
file-not-found error for "CommonStrings.tx.", and shows you a line in your 
source that explicitly says:

#include "CommonStrings.txt"

? Try Build > Preprocess on the #including file, and see what the line looks 
like net of preprocessing. There may be other factors, like the relative 
directories of the #including source and the .txt file. I wouldn't be surprised 
if files with conventional source-file extensions got special-case searching 
treatment that other file types didn't. 

I'd bet switching to a more conventional #import/#include strategy will fix the 
anomaly, and you might want to forget about it then.

        — F

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to