Note that there are some explanatory texts on larger screens.

plurals
  1. POChecking for the existence of externally defined identifiers in C
    primarykey
    data
    text
    <p>I ran into this problem while developing in Objective-C for iOS, but this should apply to any C/C++/Objective-C code using the Mac OS X/iOS linker. The solution is covered by <a href="https://stackoverflow.com/questions/3002833/weak-linking-on-iphone-refuses-to-work">another question</a>, but I'm interested in the <em>why</em>.</p> <p>Let's say I'm using a linking to a library which defines a constant. In a header file there is a declaration like this:</p> <pre><code>extern char * const BrandNewIdentifier; </code></pre> <p>I want to compile my application and run it on a system with an earlier version of the library, where that constant has no definition, so to be safe I don't assume it has been defined.</p> <p>Now, if there's a function that is only defined in the most recent version of the library, I can do this:</p> <pre><code>if (BrandNewFunc) { BrandNewFunc("foobar", 42); } else { printf("Your system does not support some thing."); } </code></pre> <p>Instead of containing the address of function code, <code>BrandNewFunc</code> evaluates to NULL. I would think that the constant would behave the same way, but if I try the same pattern, the app dies while performing a check (throws EXC_BAD_ACCESS on iOS). Specifically:</p> <pre><code>if (BrandNewIdentifier) ... // blows up here </code></pre> <p>What works instead is checking the address of the identifier:</p> <pre><code>if (&amp;BrandNewIdentifier) { printf("You got it!"); } </code></pre> <p>I can see the logic: <code>BrandNewIdentifier</code> has no value, so accessing it should fail. But then why does that syntax work in the case of <code>BrandNewFunc</code>? Shouldn't I be required to check its address also? Or is it actually consistent, and there is something I've overlooked?</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload