命名空间函数的多重定义
Multiple definition of namespace function
我只是不明白为什么这不会编译。
我有三个文件:
main.cpp
#include "expression.h"
int main(int argc, char** argv)
{
return 0;
}
expression.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 并继续...
有什么线索吗?
The thing is, it seems to parse expression.h two times.
当然可以。您将其包含在两个 不同的 cpp 文件中。每个包含都会将 header 的内容转储到该翻译单元中,因此您会得到同一函数的两个定义,从而使链接器理所当然地抱怨。这与 include guards 无关,它可以防止你在 同一个文件 .
中意外包含两次
但是,您可以在 header 中定义函数。只要它被标记为内联。所以这样做:
namespace OP
{
inline char getSymbol(const unsigned char& o)
{
return '-';
}
}
inline
这是一个承诺,所有这些函数都是完全相同的,一字不差。因此,多个定义实际上被认为是同一个。但是请注意不要违反此承诺(不要使用任何可以根据包含的位置更改函数 body 的结构)。
顺便说一下,命名空间不需要以 ;
结尾,所以我冒昧地删除了它。
我只是不明白为什么这不会编译。
我有三个文件:
main.cpp
#include "expression.h"
int main(int argc, char** argv)
{
return 0;
}
expression.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 并继续...
有什么线索吗?
The thing is, it seems to parse expression.h two times.
当然可以。您将其包含在两个 不同的 cpp 文件中。每个包含都会将 header 的内容转储到该翻译单元中,因此您会得到同一函数的两个定义,从而使链接器理所当然地抱怨。这与 include guards 无关,它可以防止你在 同一个文件 .
中意外包含两次但是,您可以在 header 中定义函数。只要它被标记为内联。所以这样做:
namespace OP
{
inline char getSymbol(const unsigned char& o)
{
return '-';
}
}
inline
这是一个承诺,所有这些函数都是完全相同的,一字不差。因此,多个定义实际上被认为是同一个。但是请注意不要违反此承诺(不要使用任何可以根据包含的位置更改函数 body 的结构)。
顺便说一下,命名空间不需要以 ;
结尾,所以我冒昧地删除了它。