Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error and warnings in Xcode when declaring Array of NSString* as a global extern

I am declaring an array of NSString* in a header file of a class.
PolygonShape.h

NSString* POLYGON_NAMES[] = {@"Invalid Polygon", @"Monogon", ...};

Now I am using this in PolyginShape.m as follows:

- (NSString*) name {
return (POLYGON_NAMES [self.numberOfSides]);
}

numberOfSides is an iVar which will indicate the index at which the polygon name is stored
So far so good ... it was compiling without any errors

Then I added PolygonShape.h in my file that implements main method (note: these does not have any class definition and call functions C-Style rather than obj-c Style)

#import "PolygonShape.h"

Now when I compile, I am getting a build (linking) error

ld: duplicate symbol _POLYGON_NAMES in /Users/../Projects/CS193P/1B/What_A_Tool/build/What_A_Tool.build/Debug/What_A_Tool.build/Objects-normal/i386/PolygonShape.o and /Users/../Projects/CS193P/1B/What_A_Tool/build/What_A_Tool.build/Debug/What_A_Tool.build/Objects-normal/i386/What_A_Tool.o
collect2: ld returned 1 exit status

So I went thru stack overflow and other forums and mostly the advice was to make the global variable extern and so I did ...

extern NSString* POLYGON_NAMES[] = {@"Invalid Polygon", @"Monogon" .. };

However I am still getting the linking error and also getting 2 warnings now that says

warning: 'POLYGON_NAMES' initialized and declared 'extern'

at both the places where i am importing PolygonShape.h

What am I missing here?

Thanks.

like image 279
Dev Avatar asked Jan 24 '23 07:01

Dev


1 Answers

In your header file declare the array as:

extern const NSString* POLYGON_NAMES[];

In your source file, define the array and initialize the contents:

const NSString* POLYGON_NAMES[] = {@"Invalid Polygon", @"Monogon" };
like image 180
dmercredi Avatar answered Apr 26 '23 03:04

dmercredi