类的inline成员函数的定义一定要和调用者在同一个文件里吗???

时间:2022-06-09 10:00:46
我有个CTest类,有个inline成员函数在test.h中,其定义放在test.cpp中
然后在main.cpp中调用这个成员函数,结果提示无法链接

inline成员函数的定义一定要与调用者在同一文件内么???

11 个解决方案

#1


内联函数的定义应该放在 头文件里,内联函数对编译器必须是可见的

#2


上代码, 代码好说话

#3


引用 2 楼 newstudent_never 的回复:
上代码, 代码好说话


我晕死,这也要上代码?
好,我现场给你写个

// test.h
class CTest
{
public:
    inline void func();
};

// test.cpp
void CTest::func()
{
}

// main.cpp
#include "test.h"

int main()
{
    CTest test;
    test.func();

    return 0;
};

#4


inline函数具有内部链接,需要把inline函数的实现放到.h文件中

#5


你有两个选择:

1、直接在类中将函数定义(inline可以省略),当然函数实现要紧跟其后;

2、在类中只定义函数,类外函数实现的时候,类外要加上inline。

#6


续楼上,写在类外,并在头文件中,

另代码过长,即使加了inline,也不是内联函数

#7


引用 1 楼 zicheng_lin 的回复:
内联函数的定义应该放在 头文件里,内联函数对编译器必须是可见的


++

#8


是因为,inline就是把累的简单函数中的代码直接展开,主要用于取代C语言中的宏定义的,所以,定义inline函数一定要在H文件中。而inline函数必须简单,否则即使写上inline约束,也会被编译器决议为函数调用的。
详细的关于inline的解释,请参照:http://blog.csdn.net/lightlater/archive/2010/08/29/5848200.aspx

#9


test.cpp不包含test.h,又怎么能去定义CTest类里的一个成员函数呢. test.cpp根本不知道CTest是什么,也不知道它里边有什么

#10


引用 7 楼 anyidan 的回复:
引用 1 楼 zicheng_lin 的回复:
内联函数的定义应该放在 头文件里,内联函数对编译器必须是可见的


++


#ifndef TEST_H
#define TEST_H

#include <iostream>
using namespace std;

class CTest
{
public:
 inline void func();
};

inline void CTest::func()
{
cout<<"111"<<endl;
}

#endif


#include <stdio.h>
#include "test.h"

int main()
{
CTest c;

c.func();

return 0;
}

#11


复制下我以前处理类似问题时做的笔记:
函数声明为inline形式即被编译器处理为类似 include的方式,即把一个inline函数的内容引入另一个调用它的函数中,而不会经过函数调用的处理过程。
inline模式编译的函数,只能在定义存在的本cpp中调用,在其他的cpp中调用的话,就有符号问题,最好命名空间中给外部用的都给不用inline声明,要不然带上命名空间的符号parse打乱会产生很迷惑的链接时错误。这是因为inline是在编译器里处理的,不是在链接器的时候处理的,一个合格的inline(过于复杂的就不会被编译器当做inline处理了),它是没有符号的,可以当做是一个写成函数样子的宏。

/:^)

#1


内联函数的定义应该放在 头文件里,内联函数对编译器必须是可见的

#2


上代码, 代码好说话

#3


引用 2 楼 newstudent_never 的回复:
上代码, 代码好说话


我晕死,这也要上代码?
好,我现场给你写个

// test.h
class CTest
{
public:
    inline void func();
};

// test.cpp
void CTest::func()
{
}

// main.cpp
#include "test.h"

int main()
{
    CTest test;
    test.func();

    return 0;
};

#4


inline函数具有内部链接,需要把inline函数的实现放到.h文件中

#5


你有两个选择:

1、直接在类中将函数定义(inline可以省略),当然函数实现要紧跟其后;

2、在类中只定义函数,类外函数实现的时候,类外要加上inline。

#6


续楼上,写在类外,并在头文件中,

另代码过长,即使加了inline,也不是内联函数

#7


引用 1 楼 zicheng_lin 的回复:
内联函数的定义应该放在 头文件里,内联函数对编译器必须是可见的


++

#8


是因为,inline就是把累的简单函数中的代码直接展开,主要用于取代C语言中的宏定义的,所以,定义inline函数一定要在H文件中。而inline函数必须简单,否则即使写上inline约束,也会被编译器决议为函数调用的。
详细的关于inline的解释,请参照:http://blog.csdn.net/lightlater/archive/2010/08/29/5848200.aspx

#9


test.cpp不包含test.h,又怎么能去定义CTest类里的一个成员函数呢. test.cpp根本不知道CTest是什么,也不知道它里边有什么

#10


引用 7 楼 anyidan 的回复:
引用 1 楼 zicheng_lin 的回复:
内联函数的定义应该放在 头文件里,内联函数对编译器必须是可见的


++


#ifndef TEST_H
#define TEST_H

#include <iostream>
using namespace std;

class CTest
{
public:
 inline void func();
};

inline void CTest::func()
{
cout<<"111"<<endl;
}

#endif


#include <stdio.h>
#include "test.h"

int main()
{
CTest c;

c.func();

return 0;
}

#11


复制下我以前处理类似问题时做的笔记:
函数声明为inline形式即被编译器处理为类似 include的方式,即把一个inline函数的内容引入另一个调用它的函数中,而不会经过函数调用的处理过程。
inline模式编译的函数,只能在定义存在的本cpp中调用,在其他的cpp中调用的话,就有符号问题,最好命名空间中给外部用的都给不用inline声明,要不然带上命名空间的符号parse打乱会产生很迷惑的链接时错误。这是因为inline是在编译器里处理的,不是在链接器的时候处理的,一个合格的inline(过于复杂的就不会被编译器当做inline处理了),它是没有符号的,可以当做是一个写成函数样子的宏。

/:^)