代码之家  ›  专栏  ›  技术社区  ›  l. schwarz

命名空间函数的多个定义[重复]

  •  0
  • l. schwarz  · 技术社区  · 7 年前

    这个问题已经有了答案:

    我就是不明白为什么这个不能编译。

    我有三个文件:

    主.cpp

    #include "expression.h"
    
    int main(int argc, char** argv)
    {
    
        return 0;
    }
    

    表达式.h

    #ifndef _EXPRESSION_H
    #define _EXPRESSION_H
    
    namespace OP
    {
      char getSymbol(const unsigned char& o)
      {
        return '-';
      }
    };
    
    #endif /* _EXPRESSION_H */
    

    和expression.cpp

    #include "expression.h"
    

    (OFC里面有更多的内容,但是即使我评论除了 #include 出了问题)

    我用编译它

    g++ main.cpp expression.cpp -o main.exe
    

    这是我得到的错误:

    C:\Users\SCHIER~1\AppData\Local\Temp\ccNPDxb6.o:expression.cpp:(.text+0x0): multiple definition of `OP::getSymbol(unsigned char const&)'
    C:\Users\SCHIER~1\AppData\Local\Temp\cc6W7Cpm.o:main.cpp:(.text+0x0): first defined here
    collect2.exe: error: ld returned 1 exit status
    

    问题是,它似乎 expression.h 两次。如果我只是用 main.cpp expression.cpp 我不知道这个错误。编译器只是忽略了我的ifndef并继续…

    有什么线索吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   StoryTeller - Unslander Monica    7 年前

    问题是,它似乎解析了两次expression.h。

    当然可以。你把它包括在两个里面 不同的 cpp文件。每个包含都将头的内容转储到该翻译单元中,因此您可以得到同一函数的两个定义,从而使链接器正确地抱怨。这与包含警卫无关,这些警卫可以保护你不被意外地包括在 同一个文件 .

    但是,您可以在头中定义一个函数。只要它标记为inline。这样做:

    namespace OP
    {
      inline char getSymbol(const unsigned char& o)
      {
        return '-';
      }
    }
    

    inline 这是一个承诺,所有这些职能是完全相同的,以信。所以多个定义实际上被认为是一个相同的定义。但是要小心不要违背这个承诺(不要使用任何可以根据包含函数体的位置更改函数体的构造)。

    顺便说一下,命名空间不需要用 ; ,所以我冒昧地把它移走了。