multiple definition

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Jochen Zeischka

    multiple definition

    Hi everybody!

    I have a question concerning code organisation. Suppose I have the following
    header file:

    #ifndef SOME_NAME
    #define SOME_NAME

    namespace N {
    void F()

    ... here comes the implementation
    }
    }

    #endif

    In this case I would think that you never ever can encounter a 'multiple
    definition' problem because
    1) SOME_NAME is defined the first time F is defined
    2) there is only one definition of F, so it even wouldn't be a problem to
    define the same F a hundred times...

    Still, I get the error message that F is multiply defined when this header
    file is used in other header files. (And there is definitely not another 'F'
    defined in any of these header files)

    Can anyone help me out?

    Thanks!

    Jochen


  • Josephine Schafer

    #2
    Re: multiple definition


    "Jochen Zeischka" <jochen.zeischk a@rug.ac.be> wrote in message
    news:bdrv8k$nki $1@gaudi2.UGent .be...[color=blue]
    > Hi everybody!
    >
    > I have a question concerning code organisation. Suppose I have the[/color]
    following[color=blue]
    > header file:
    >
    > #ifndef SOME_NAME
    > #define SOME_NAME
    >
    > namespace N {
    > void F()
    >
    > ... here comes the implementation
    > }
    > }
    >
    > #endif
    >
    > In this case I would think that you never ever can encounter a 'multiple
    > definition' problem because
    > 1) SOME_NAME is defined the first time F is defined
    > 2) there is only one definition of F, so it even wouldn't be a problem[/color]
    to[color=blue]
    > define the same F a hundred times...
    >
    > Still, I get the error message that F is multiply defined when this header
    > file is used in other header files. (And there is definitely not another[/color]
    'F'[color=blue]
    > defined in any of these header files)
    >
    > Can anyone help me out?
    >
    > Thanks!
    >
    > Jochen[/color]

    Please note that the header guards protect multiple inclusion of a header
    file in
    a single translation unit(e.g.cpp file). If you happen to include this
    header file in several
    translation units then the linker problem will arise. Either move the
    definition to some implementation file or
    else make the function inline(only if it suits in your case) .





    Comment

    • Samuele Armondi

      #3
      Re: multiple definition


      "Jochen Zeischka" <jochen.zeischk a@rug.ac.be> wrote in message
      news:bdrv8k$nki $1@gaudi2.UGent .be...[color=blue]
      > Hi everybody!
      >
      > I have a question concerning code organisation. Suppose I have the[/color]
      following[color=blue]
      > header file:
      >
      > #ifndef SOME_NAME
      > #define SOME_NAME
      >
      > namespace N {
      > void F()
      >
      > ... here comes the implementation
      > }
      > }
      >
      > #endif
      >
      > In this case I would think that you never ever can encounter a 'multiple
      > definition' problem because
      > 1) SOME_NAME is defined the first time F is defined
      > 2) there is only one definition of F, so it even wouldn't be a problem[/color]
      to[color=blue]
      > define the same F a hundred times...
      >
      > Still, I get the error message that F is multiply defined when this header
      > file is used in other header files. (And there is definitely not another[/color]
      'F'[color=blue]
      > defined in any of these header files)
      >
      > Can anyone help me out?
      >
      > Thanks!
      >
      > Jochen
      >
      >[/color]
      I had the same problem. I solved it by splitting the code into two: the
      declarations in a .h file and _all_ the implementations in a .cpp file, i.e.
      // foo.h
      #ifndef foo_h
      #define foo_h

      namespace n
      {
      class bar
      {
      private:
      int i;
      public:
      bar(int);
      void f();
      };
      }
      #endif

      //foo.cpp
      n::bar::bar(int n) : i(n)
      {
      }

      void n::bar::f()
      {
      //whatever
      }

      HTH,
      S. Armondi



      Comment

      Working...