This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Declaration of global variables in one header file

Hello everyone,

I'm trying to split the C source code of one file into nearly 10 different. It does not work properly due to global variables declared in one header file but used in more than one C files. Compiling of such a project works fine but the linking errors L104 and L118 occur.

My question: How can I prevent this errors without creating one header file for every C file?

My idea is the following, but it is complicated and additionally unsure if it works:

#ifdef CPVAR
extern unsigned char global_var1;
extern unsigned int global_var2;
extern unsigned long global_var3;
#elseif
unsigned char global_var1;
unsigned int global_var2;
unsigned long global_var3;
#define CPVAR
#endif

Maybe one of the experts knows a less complicated opportunity to prevent (these) linker errors.

Parents
  • Tobias,

    I try to desrcibe with in simple examples:

    this is how you define the variables in every C file:

    in file1.c

    unsigned char global_var1;
    

    in file2.c
    unsigned int global_var2;
    

    in file3.c
    unsigned long global_var3;
    

    To use these variables in other files you need to use external declarations.
    Like this:

    header.h
    extern unsigned char global_var1;
    extern unsigned int global_var2;
    extern unsigned long global_var3;
    

    Of course you need to include the file header.h in all C files where you need to know the global variables.

    Note, that you also can declare variables externally in other C files.

    CB

Reply
  • Tobias,

    I try to desrcibe with in simple examples:

    this is how you define the variables in every C file:

    in file1.c

    unsigned char global_var1;
    

    in file2.c
    unsigned int global_var2;
    

    in file3.c
    unsigned long global_var3;
    

    To use these variables in other files you need to use external declarations.
    Like this:

    header.h
    extern unsigned char global_var1;
    extern unsigned int global_var2;
    extern unsigned long global_var3;
    

    Of course you need to include the file header.h in all C files where you need to know the global variables.

    Note, that you also can declare variables externally in other C files.

    CB

Children
  • While many will decry what you're trying to do with global variables to be heresy
    Of course it is heresy to use a technique that guarantees that the "internal" and external is the same.

    Making programs that automatically are correct may cost someone a job fixing the bugs your other method has introduced.

    If a method that makes programming safer> makes it "impure" so friggin what. Is good, maintainable = code not more important than "pure" code.

    Erik

  • erik,

    Your fervor to rebuke me seems to have overpowered your ability to convey your point.

    Of course it is heresy to use a technique that guarantees that the "internal" and external is the same.

    Guarantees that the "internal" and external what are the same? Linkage? All I've done is define a kludged linkage specifier. As you well know, none of those variables can or will have both internal and external linkage in the same compilation unit.

    Making programs that automatically are correct may cost someone a job fixing the bugs your other method has introduced.

    How does my method affect the "automatic"-ness of anything? If someone misunderstands and tries to put a #define DECLARGLOBALSHERE in another compilation unit, link will fail. If someone doesn't understand and fails to put the definition in ANY unit, link will fail. As such, I'm not sure how this is any less automatic than someone knowing to extern a variable they want to use.

    If a method that makes programming safer> makes it "impure" so friggin what. Is good, maintainable = code not more important than "pure" code.

    I'm not sure where the discussion of the relative "purity" of anything came up? Can you elaborate on what you mean?

  • sorry, about missing the preview, the highlights in my previous post are all wrong. I was fighting an intruder at the same time.

    Your fervor to rebuke me seems to have overpowered your ability to convey your point.
    rebuke???, I agreed with you. I supported your statement "While many will decry what you're trying to do with global variables to be heresy" which, as shown by your post you do not.

    I'm not sure where the discussion of the relative "purity" of anything came up? Can you elaborate on what you mean?
    Those that "decry what you're trying to do with global variables to be heresy" are the same that like yo use the expression "not real C" about anything that is legible.

    Erik

  • erik,

    Wow... I guess I totally missed your point. My apologies. Yes, I think when you use that particular method, that things end up being fairly readable, and I personally like it better than having global variables smattered at the top of each C file.

    Nonetheless, I do find that things I write tend to devolve into ugliness when I'm doing C51 code with this method. For instance, I almost always need to have some variables located with the _at_ keyword, which leads to the following sort of construct:

    #ifdef DEFINEGLOBALSHERE
    #define GLOBAL
    unsigned char somespecialvar _at_ 0x0200;
    #else
    #define GLOBAL extern
    extern unsigned char somespecialvar;
    #endif
    
    GLOBAL unsigned char somenormalvar;
    

    and so forth. Then, if I'm unlucky enough to need to initialize a global where it's defined, I have to do it similarly. Anyway... I guess my point is just that it's useful, but will be extremely ugly if you're not careful with it.

  • Take a look at the following knowledgebase article for several other ideas about how to do this:

    http://www.keil.com/support/docs/1868.htm

    Jon

  • Problem is solved.

    Thank you guys!

  • "Managing software engineers is like trying to herd cats"

    -Anonymous silicon valley manager

  • "Managing software engineers is like trying to herd cats"

    But what if the result is the cat's miauw?

    Erik