C++ 我可以实现所有C++;头文件中的成员函数,但不用于内联?
对于C程序,我知道我需要.h和.cpp来允许多个.h一起读取和编译,但稍后链接C++ 我可以实现所有C++;头文件中的成员函数,但不用于内联?,c++,inline,header-files,C++,Inline,Header Files,对于C程序,我知道我需要.h和.cpp来允许多个.h一起读取和编译,但稍后链接 但是,对于C++,我不想将类成员函数声明和定义分解为两部分。虽然它是典型的C++方式,但我试图将一个头文件中的成员函数声明和定义合并。我看到一些人在做那件事。我想知道这样做是否有任何问题 我知道在.h类定义中定义的所有成员都是内联函数,但它们可以以任何方式非内联吗?例如,当函数很大时,编译器是否可以控制以使它们不必内联 VS2015 intellisense在2s位于头文件中定义的成员函数中时显示错误,但在cpp文件
但是,对于C++,我不想将类成员函数声明和定义分解为两部分。虽然它是典型的C++方式,但我试图将一个头文件中的成员函数声明和定义合并。我看到一些人在做那件事。我想知道这样做是否有任何问题
std::this_thread::sleep_for(2s)下显示一行读取内容代码>
我不想争论wich样式是否更好,但希望关注它是否有效,以及取舍是什么。如果需要,将所有实现代码都放在.h文件中是完全可以的,这通常取决于具体情况。通过这样做,通常最好将接口和实现分开,即使所有代码都在.h文件中
class MyClass {
public:
void doSomethingUseful();
};
....
void MyClass::doSomethingUseful() {
// code goes here....
}
并非所有函数都会自动内联,编译器通常决定内联或不内联什么。较大的函数可能不会内联,即使它们位于标头中。您可以使用inline关键字向编译器提示您希望函数内联,但这并不能保证(顺便说一句,在.cpp文件中标记为内联的函数将内联,但仅当从同一.cpp文件中的其他函数调用时)
由于.h文件中的代码越多,编译速度就会越慢,因此最好尽量减少其中的代码量。我想在你的情况下,它不应该那么明显
我希望这能有所帮助!:) 您可以在函数周围放置定义,以防止它们被多次实现 头文件:-
class MyClass {
public:
void doSomethingUseful();
};
// inline functions
....
// non inline function
#ifdef MYCLASSCPP
void MyClass::doSomethingUseful() {
// code goes here....
}
#endif
然后在一个CPP文件中定义MYCLASSCPP。(或编译器参数)。编译器是否可以控制,以便不必内联,例如,当函数很大时?-不管编译器是否标记为
inline
(包括内联成员函数定义),编译器都会这样做。现在,遵循一个定义规则是最重要的部分。如果你想在标题中这样分割它们,你最好也弥补从类中的定义中得到的隐式内联,这样你就不会违反ODR。我不确定这是否与ODR完全相关(一个定义规则-我必须查找该首字母缩写;))但是关于隐式内联,您完全正确-本文有一个很好的解释-通过在标题中提供一个常规定义,两个独立的翻译单元(包括标题)将生成两个定义副本。两个简单的旧定义不符合“一个定义”规则。我对这篇文章也不太确定:例如,如果在类中声明一个成员函数,然后在类体之外定义该成员函数,则类内声明必须在两个位置都包含显式内联。-任何一个地方(声明或定义)都是可以的,也会起同样的作用。就我个人而言,我觉得应该是后者,作为一个实现细节来对待。谢谢大家。我想我会这样做(全部在.h中),如果在构建时遇到问题,我会将它们分为两个位置。编译时间不一定会增加,因为最终的翻译单元会减少。
class MyClass {
public:
void doSomethingUseful();
};
// inline functions
....
// non inline function
#ifdef MYCLASSCPP
void MyClass::doSomethingUseful() {
// code goes here....
}
#endif