我可以在头文件中实现所有C ++成员函数,但不能用于内联吗?

时间:2015-12-02 23:48:23

标签: c++ inline header-files

对于C程序,我知道我需要.h和.cpp来允许多个.h一起读取和编译,但稍后会链接。

但是,对于C ++,我不想将类成员函数声明和定义分解为两部分。虽然它是典型的C ++方式,但我试图在一个头文件中合并成员函数声明和定义。我看到有些人这样做。我想知道是否有任何问题要做到这一点。

  1. 我知道.h类定义中定义的所有成员都是内联函数,但它们是否可以以任何方式非内联?编译器是否可控,以便它们不必内联,例如,当函数很大时?
  2. 当2s在头文件中定义的成员函数中时,VS2015 intellisense显示错误,但在cpp文件中没有显示。但它编译。它表明我做错了,还是VS2015的错误?我删除了sdf,重新启动了项目,只要将该函数复制到.h文件中,它就会显示std::this_thread::sleep_for(2s);下的读取行
  3. class testtest {
        void tryagain() {
            using namespace std::chrono_literals;
            auto twosec = 2s;
            std::this_thread::sleep_for(2s);// problem is here
        }
    };
    
    1. 如果我们分开.h和.cpp?
    2. ,编译速度会更快
    3. 我的最终编译器是g ++ 4.9.2,我使用VS2015来测试构建。最终代码将在Linux上运行1GB RAM的ARM上运行。
    4. 我不打算争论哪种风格更好,但希望关注它是否有效,以及有什么权衡。

2 个答案:

答案 0 :(得分:1)

如果需要,可以将所有实现代码放在.h文件中,这通常取决于具体情况。即使所有代码都在.h文件中,通过执行类似的操作来分割界面和实现通常也是很好的做法

class MyClass {
public:
    void doSomethingUseful();
};

....

void MyClass::doSomethingUseful() {
    // code goes here....
}

并非所有函数都会自动内联,编译器通常会决定内嵌与否。即使它们位于标题中,也可能不会内联更大的函数。您可以使用inline关键字向编译器提供您希望内联函数的提示,但这不是保证(另外,在.cpp文件中标记为内联的函数将被内联,但只有当从同一个.cpp文件中的其他函数调用时才<)

.h文件中的代码越多,编译时间就越慢,因此最好尽量减少代码中的代码量。我猜你的情况虽然不应该那么明显。

我希望有一些帮助! :)

答案 1 :(得分:1)

您可以在函数周围放置定义,以防止它们被多次实现 头文件: -

class MyClass {
public:
    void doSomethingUseful();
};
// inline functions

....
// non inline function
#ifdef MYCLASSCPP
void MyClass::doSomethingUseful() {
    // code goes here....
}
#endif

然后在一个CPP文件中定义MYCLASSCPP。 (或编译器参数)。