Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以实现所有C++;头文件中的成员函数,但不用于内联?_C++_Inline_Header Files - Fatal编程技术网

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

C++ 我可以实现所有C++;头文件中的成员函数,但不用于内联?,c++,inline,header-files,C++,Inline,Header Files,对于C程序,我知道我需要.h和.cpp来允许多个.h一起读取和编译,但稍后链接 但是,对于C++,我不想将类成员函数声明和定义分解为两部分。虽然它是典型的C++方式,但我试图将一个头文件中的成员函数声明和定义合并。我看到一些人在做那件事。我想知道这样做是否有任何问题 我知道在.h类定义中定义的所有成员都是内联函数,但它们可以以任何方式非内联吗?例如,当函数很大时,编译器是否可以控制以使它们不必内联 VS2015 intellisense在2s位于头文件中定义的成员函数中时显示错误,但在cpp文件

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

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

  • 我知道在.h类定义中定义的所有成员都是内联函数,但它们可以以任何方式非内联吗?例如,当函数很大时,编译器是否可以控制以使它们不必内联
  • VS2015 intellisense在2s位于头文件中定义的成员函数中时显示错误,但在cpp文件中未显示该错误。但它是编译的。这是表明我做错了,还是VS2015的一个bug?我删除了sdf,重新启动了项目,只要将函数复制到.h文件中,它就会在
    std::this_thread::sleep_for(2s)下显示一行读取内容
  • 如果我们分开.h和.cpp,编译速度会更快吗
  • 我的最终编译器将是g++4.9.2,我正在使用VS2015测试构建。最后的代码将在Linux上具有1GB RAM的ARM上运行

  • 我不想争论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