inline函数可否写在cpp文件中?

fibbery 2008-06-23 05:06:48
我有这样一种需求:
inline函数一般都是跟类的定义一起写在头文件中,但是我觉得这样类的实际定义看上去会很乱;如果写在类外面加上inline关键字,那么当多个文件包含了该文件编译时可能会出错,比如同一个class的构造函数符号会出现在多个obj文件里,使链接发生错误!

总之,我想把inline函数与class的定义分开到cpp里面,有没有什么办法?
...全文
1104 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fibbery 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xkyx_cn 的回复:]
可以这样做:在每个引用该函数的cpp里面都定义一次
如此一来似乎更麻烦了
[/Quote]

我并不是要在每一个cpp文件中定义,所以,你觉得的可以实际上对于我来说是不可以的!


感谢大家:
感谢大家的参与,尤其是楼上(15楼)的回复,受益匪浅。

如果一个累得所有函数都是精小的,那么都在类里面直接写为inline函数也不错,
如果一个类的部分函数精小,部分函数可能会复杂些,那么复杂的这部分就会写在cpp中,这样,一本分在头文件中一部分在cpp中,总觉得不爽!

也许是鱼跟熊掌不可兼得吧!

不知道大家遇到这种情况是怎么处理的?
yyyapple 2008-06-23
  • 打赏
  • 举报
回复
(一)inline函数(摘自C++ Primer的第三版)

在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联。

inline int min(int first, int secend) {/****/};

inline函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数。与非inline
函数不同的是,inline函数必须在调用该函数的每个文本文件中定义。当然,对于同一程序
的不同文件,如果inline函数出现的话,其定义必须相同。对于由两个文件compute.C和draw.C构成的程序来说,程序员不能定义这样的min()函数,它在compute.C中指一件事情,
而在draw.C中指另外一件事情。如果两个定义不相同,程序将会有未定义的行为:

为保证不会发生这样的事情,建议把inline函数的定义放到头文件中。在每个调用该inline函数的
文件中包含该头文件。这种方法保证对每个inline函数只有一个定义,且程序员无需复制代码,并且
不可能在程序的生命期中引起无意的不匹配的事情。

(二)内联函数的编程风格(摘自高质量C++/C 编程指南)

关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。

如下风格的函数Foo 不能成为内联函数:
inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y)
{
}
而如下风格的函数Foo 则成为内联函数:
void Foo(int x, int y);
inline void Foo(int x, int y) // inline 与函数定义体放在一起
{
}
所以说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。
一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内
联函数的声明、定义体前面都加了inline 关键字,但我认为inline 不应该出现在函数
的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格
的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需
要内联。

K行天下 2008-06-23
  • 打赏
  • 举报
回复
inline函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数。
与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件中定义。所以,如果你要放到实现文件,则每一个实现文件中都需要定义,
而且定义要一样, 这样不是更加麻烦了吗?

飞翔的雨也给出了简单例子

所以,还是放到头文件, 使其它实现文件包含它, 能减少出错, 也更简单易读!!
xkyx_cn 2008-06-23
  • 打赏
  • 举报
回复

// a.hpp
class CInlineTesting
{
public:
void internal_inline(void) {;}
void external_inline(void); // static is not necessary
void caller(void);
};

// a.cpp
#include "a.hpp"

inline void CInlineTesting::external_inline(void)
{
return;
}

void CInlineTesting::caller()
{
external_inline();
internal_inline();
}

// main.cpp
#include "a.hpp"

inline void CInlineTesting::external_inline()
{
return;
}

int main()
{
CInlineTesting _inline_testing;
_inline_testing.internal_inline();
_inline_testing.external_inline();
return 0;
}

xkyx_cn 2008-06-23
  • 打赏
  • 举报
回复
Simplest illustration:

// a.hpp
class CInlineTesting
{
public:
void internal_inline(void) {;}
static void external_inline(void);
void caller(void);
};

// a.cpp
#include "a.hpp"

inline void CInlineTesting::external_inline(void)
{
return;
}

void CInlineTesting::caller()
{
external_inline();
internal_inline();
}

// main.cpp
#include "a.hpp"

inline void CInlineTesting::external_inline()
{
return;
}

int main()
{
CInlineTesting _inline_testing;
_inline_testing.internal_inline();
_inline_testing.external_inline();
return 0;
}
星光伴月 2008-06-23
  • 打赏
  • 举报
回复
好像不可以的。
shada 2008-06-23
  • 打赏
  • 举报
回复
可以但没必要。~~~~~~~~~~~~~~~~~~
xkyx_cn 2008-06-23
  • 打赏
  • 举报
回复
可以这样做:在每个引用该函数的cpp里面都定义一次
如此一来似乎更麻烦了

[Quote=引用楼主 fibbery 的帖子:]
我有这样一种需求:
inline函数一般都是跟类的定义一起写在头文件中,但是我觉得这样类的实际定义看上去会很乱;如果写在类外面加上inline关键字,那么当多个文件包含了该文件编译时可能会出错,比如同一个class的构造函数符号会出现在多个obj文件里,使链接发生错误!

总之,我想把inline函数与class的定义分开到cpp里面,有没有什么办法?
[/Quote]
sukyin 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fibbery 的回复:]

呵呵,我实际上只是想在两个文件中写定义和代码,并且还想把简单的函数使用inline方式实现。
[/Quote]
那样的话,四楼的方法都可以。而且不只是成员函数。任何函数都可以inline的。
ryfdizuo 2008-06-23
  • 打赏
  • 举报
回复
inline函数直接类里面定义就行了,为什么还放外面,还要放到cpp中,
fibbery 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sukyin 的回复:]
一看标题,我想回答:可以。
再看楼主的描述。我想回答:这家伙想干嘛?那样岂不是乱写?inline都是写在头文件类里面的。怎么会觉得乱?
[/Quote]

呵呵,我实际上只是想在两个文件中写定义和代码,并且还想把简单的函数使用inline方式实现。
matrixdwy 2008-06-23
  • 打赏
  • 举报
回复

inline void A::f()
matrixdwy 2008-06-23
  • 打赏
  • 举报
回复
LZ这个意思?

//A.H
class A {
public:
void f();
}



#include "A.H"

inline A::f() {
//....
}
sukyin 2008-06-23
  • 打赏
  • 举报
回复
一看标题,我想回答:可以。
再看楼主的描述。我想回答:这家伙想干嘛?那样岂不是乱写?inline都是写在头文件类里面的。怎么会觉得乱?
fibbery 2008-06-23
  • 打赏
  • 举报
回复
只有想不到的,没有做不到的!

我现在相当于有两个疑问:
1、编译器是否支持我的想法?
2、如果支持,我该怎么做,我需要G++和Vc++两种编译器的方法!

我查过vc的,看过一个可能是我需要的选项,但是我没有弄清楚,编译总是出错。
baihacker 2008-06-23
  • 打赏
  • 举报
回复
如果在某个cpp文件内
其它引用了这个inline函数的文件,在哪里知道这个inline函数的代码?

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧