C++ 命名空间中的内联函数提供了对C+;的未定义引用+;
我有一个非常简单的程序,在其中我定义了自己的名称空间,并且需要一个内联函数。这看起来像下面这个: 测试.hC++ 命名空间中的内联函数提供了对C+;的未定义引用+;,c++,namespaces,inline,C++,Namespaces,Inline,我有一个非常简单的程序,在其中我定义了自己的名称空间,并且需要一个内联函数。这看起来像下面这个: 测试.h #ifndef _TEST_H_ #define _TEST_H_ #include <iostream> using namespace std; namespace NS { class EXAMPLE { int i; float f; public: void doSth(); }; } #endif 我这样编译它:g++main.
#ifndef _TEST_H_
#define _TEST_H_
#include <iostream>
using namespace std;
namespace NS
{
class EXAMPLE
{
int i;
float f;
public:
void doSth();
};
}
#endif
我这样编译它:g++main.cpp test.cpp-o app
,结果是
/tmp/ccFwG8do.o: In function `main':
main.cpp:(.text+0x10): undefined reference to `NS::EXAMPLE::doSth()'
collect2: error: ld returned 1 exit status
有什么想法吗?一个
内联
函数必须在使用它的所有翻译单元中定义为内联
,定义相同
本质上,这意味着要么(1)只在一个翻译单元中使用它,要么(2)将定义放在包含在使用函数的每个翻译单元中的标题中
用例(1)是一个希望代码提示>内联的提示作用,它指示编译器在生成的机器代码中考虑是否对函数进行内联调用。用例(2)是关于
inline
提供的保证,即在多个翻译单元中使用该函数不会违反一个定义规则(或通常所指的ODR)。在使用该函数的所有翻译单元中,必须使用相同的定义将inline
函数定义为inline
本质上,这意味着要么(1)只在一个翻译单元中使用它,要么(2)将定义放在包含在使用函数的每个翻译单元中的标题中
用例(1)是一个希望代码提示>内联的提示作用,它指示编译器在生成的机器代码中考虑是否对函数进行内联调用。用例(2)是关于
inline
所提供的保证,即在多个翻译单元中的这种使用不会违反一个定义规则(或者经常提到的ODR)。如果您希望它是内联的,那么实现必须在头中,并且需要在那里声明为inline。否则,编译器无法将其内联到其他编译单元中,因为它看不到详细信息。注意:\u TEST\u H
是保留名称。注意:使用名称空间std不得在标头的全局命名空间中使用代码>。例如,使用名称distance
并包含该标题的代码可能会导致名称冲突。Ungood.注意:所有大写名称NS
和示例
都可能与宏名称冲突,导致意外和不需要的文本替换。要避免这种情况,常用的惯例是,所有宏都使用大写名称,并且只适用于宏。“医生,如果我这样移动手臂会很痛。”“那么,不要那样移动手臂。”如果您希望它是内联的,则实现必须在头中,并且需要在那里声明为内联。否则,编译器无法将其内联到其他编译单元中,因为它看不到详细信息。注意:\u TEST\u H
是保留名称。注意:使用名称空间std不得在标头的全局命名空间中使用代码>。例如,使用名称distance
并包含该标题的代码可能会导致名称冲突。Ungood.注意:所有大写名称NS
和示例
都可能与宏名称冲突,导致意外和不需要的文本替换。避免这种情况的常见惯例是,对所有宏使用所有大写名称,并且只对宏使用。“医生,如果我这样移动手臂会很痛。”“那么,不要那样移动手臂。”
#include "test.h"
int main()
{
NS::EXAMPLE e;
e.doSth();
return 0;
}
/tmp/ccFwG8do.o: In function `main':
main.cpp:(.text+0x10): undefined reference to `NS::EXAMPLE::doSth()'
collect2: error: ld returned 1 exit status