C++ 与类成员一起使用内联说明符时未定义的引用
我在一个类中有一些成员函数。当我使用内联说明符时,编译器会抱怨引用未定义 我试过: 仅在类头文件中的函数定义前面使用“inline” 在class.cpp中的函数声明之前使用“inline”,其中成员函数仅在文件中指定 同时执行上述两项操作 显然,其中一种方法是正确的,而其他方法则不正确。然而,尝试每个选项并没有让我得到一个编译的程序 以下是我试图做的: .hpp文件:C++ 与类成员一起使用内联说明符时未定义的引用,c++,class,inline,member-functions,C++,Class,Inline,Member Functions,我在一个类中有一些成员函数。当我使用内联说明符时,编译器会抱怨引用未定义 我试过: 仅在类头文件中的函数定义前面使用“inline” 在class.cpp中的函数声明之前使用“inline”,其中成员函数仅在文件中指定 同时执行上述两项操作 显然,其中一种方法是正确的,而其他方法则不正确。然而,尝试每个选项并没有让我得到一个编译的程序 以下是我试图做的: .hpp文件: class A{ void func(); } class A{ inline void func(); };
class A{
void func();
}
class A{
inline void func();
};
void A::func() {...}
.cpp文件:
。。。包括
inline void A::func()
{
...
}
或者“内联”可能会出现在其他地方。正如我上面解释的,我已经尝试了我能想到的所有可能的组合。现在看看有人告诉我,我需要在函数名和参数之后使用它,比如关键字“const”
有人知道我做错了什么吗?我试着用谷歌搜索正确答案,但没有成功。类中的“内联”函数是一种东西吗?内联函数必须在头文件中定义。函数体的定义必须在尝试使用该函数的所有翻译单元中可见。您可以直接在类中定义它。或者您可以在代码中定义它,即在类之外。但它必须在头文件中,而不是在.cpp文件中
尝试在.cpp文件中定义内联函数将使其仅在该.cpp文件中可用。尝试在其他.cpp文件中使用它将导致链接器错误,即未定义的引用错误。必须在头文件中定义内联函数。函数体的定义必须在尝试使用该函数的所有翻译单元中可见。您可以直接在类中定义它。或者您可以在代码中定义它,即在类之外。但它必须在头文件中,而不是在.cpp文件中 尝试在.cpp文件中定义内联函数将使其仅在该.cpp文件中可用。尝试在其他.cpp文件中使用它将导致链接器错误,即未定义的引用错误。将内联任何内容放入cpp文件中只能内联该文件中的函数。如果希望鼓励编译器内联函数,则需要忘记CPP文件。而是在hpp文件中执行以下操作:
class A{
inline void func();
};
void A::func() {...}
注意:有几点:
内联并不意味着函数将内联。这是对编译器的提示。
您需要在gcc中优化-O3,以便有机会将其内联
如果在类内定义函数,则它隐式地在以下位置上具有内联关键字:
class A{
inline void func() {
...
}
};
与上面相同,它在类中内联声明,而定义在外部
有一些方法可以强制GCC使用函数属性内联代码,但我不会描述它们,因为使用它们很少是一个好主意。对于每个函数的内联,GCC应该做得最好。强制它执行其他操作几乎总是会导致性能下降。在CPP文件中插入任何内联内容都只能将函数内联到该文件中。如果希望鼓励编译器内联函数,则需要忘记CPP文件。而是在hpp文件中执行以下操作:
class A{
inline void func();
};
void A::func() {...}
注意:有几点:
内联并不意味着函数将内联。这是对编译器的提示。
您需要在gcc中优化-O3,以便有机会将其内联
如果在类内定义函数,则它隐式地在以下位置上具有内联关键字:
class A{
inline void func() {
...
}
};
与上面相同,它在类中内联声明,而定义在外部
有一些方法可以强制GCC使用函数属性内联代码,但我不会描述它们,因为使用它们很少是一个好主意。对于每个函数的内联,GCC应该做得最好。强制它执行其他操作几乎总是会导致性能下降。为什么要将该函数标记为内联?您可能会有一种奇怪的想法,即inline关键字与编译器内联代码有某种关联……这不是内联函数吗?不,不是真的。。。“内联”仅意味着实现工具集“编译器+链接器”可以看到在多个翻译单元中定义的完全相同的函数,这不会导致违反“一个定义”规则。除此之外,编译器是内联代码还是生成外联定义是完全不同的,但在一般情况下,如果定义出现在标题中,则.cpp将不起作用。为什么要将该函数标记为内联?您可能会有一种奇怪的想法,即inline关键字与编译器内联代码有某种关联……这不是内联函数吗?不,不是真的。。。内联仅意味着实现工具集编译器+链接器可以看到
e在多个翻译单元中定义的相同功能,不会违反一个定义规则。除此之外,编译器是内联代码还是生成一个行外定义是完全不同的,但在一般情况下,如果定义出现在标题中,则.cpp不起作用。@Edward Bird:不起作用。您得到的未定义引用正是:g++不同意您的意见,也同意我的意见。在头文件中,我有一个函数,我已指定为内联函数。如果没有内联关键字,它可以很好地编译。爱德华·伯德:是的,这正是我要告诉你的。非内联函数必须在一个位置定义,并且只能在一个位置定义。这就是您通常将定义放入.cpp文件的原因。但内联函数必须在使用它的每个翻译单元的任何地方反复定义。这就是内联函数通常在头文件中定义的原因。换句话说,您不能通过添加/删除内联关键字在内联和非内联版本之间切换。每次切换时都必须重新组织代码。@EdwardBird,真的吗?试图用正确的方式解释某事是胡说八道吗?该标准讨论了转换单元和odr与内联的结合使用。安德烈怎么会太聪明了?这里引用§3.2/3一个内联函数应该在odr使用的每个翻译单元中定义。@Edward Bird:不,它没有。您得到的未定义引用正是:g++不同意您的意见,也同意我的意见。在头文件中,我有一个函数,我已指定为内联函数。如果没有内联关键字,它可以很好地编译。爱德华·伯德:是的,这正是我要告诉你的。非内联函数必须在一个位置定义,并且只能在一个位置定义。这就是您通常将定义放入.cpp文件的原因。但内联函数必须在使用它的每个翻译单元的任何地方反复定义。这就是内联函数通常在头文件中定义的原因。换句话说,您不能通过添加/删除内联关键字在内联和非内联版本之间切换。每次切换时都必须重新组织代码。@EdwardBird,真的吗?试图用正确的方式解释某事是胡说八道吗?该标准讨论了转换单元和odr与内联的结合使用。安德烈怎么会太聪明了?这里引用§3.2/3,在使用odr的每个翻译单元中都应定义内联函数。