Friday 15 January 2010

c - Why can't I declare and assign global variable in a header file, even when using #ifndef HEADER_H -



c - Why can't I declare and assign global variable in a header file, even when using #ifndef HEADER_H -

i saw similar questions, in none of them, #ifndef header_h mentioned.

i have header file , 2 c files: constants.h main.c mylib.c

in constants.h:

#ifndef constants_h #define constants_h const int num_of_items = 22; #endif

in mylib.c:

#include "constants.h" ... code ...

in main.c:

#include "constants.h" int main() { ... code ... }

when compile using command: gcc main.c mylib.c -o main, next error:

/tmp/ccl55fv3.o:(.rodata+0x0): multiple definition of `num_of_items' /tmp/ccyzhu6f.o:(.rodata+0x0): first defined here collect2: ld returned 1 exit status i mentioned #ifndef, why happens?? is there except splitting constants.h declaration , constants.c assignment?

the include guard required prevent multiple-inclusion single translation unit during compilation. error have on other hand linker error - because have more 1 translation unit (object file) containing same definition.

in c 1 commonly utilize #define define constants macros. has downsides respect type safety. alternatively can 1 2 things:

localise constant in each translation unit declaring static:

static const int num_of_items = 22;

declare extern, define in single translation unit:

extern const int num_of_items ;

constants.c:

#include constants .h const int num_of_items = 22;

option 1 mutual practice in c++ semantics of const different c, or @ to the lowest degree more defined, , unless reference or pointer taken constant, constant inserted code if macro - i.e. there no distinct storage of "variable". in c code may or may not happen, work either way potentially marginally less efficiently.

c gcc

No comments:

Post a Comment