内联函数嵌套使用规则

来源:互联网 发布:python string empty 编辑:程序博客网 时间:2024/05/14 16:04

在使用内联函数时发现一个问题:内联不能嵌套使用?

代码大致如下:

// 头文件

#ifndef INLINESTUDY_H

#define INLINESTUDY_H

 #include <iostream>

#include <iomanip>

using namespacestd;

class A

{

public:

    A() {}

    inline voidFunA();

};

#endif


//源文件1

#include "InlineStudy.h"

#pragma once

inline voidA::FunA()

{

    cout<< "inline A" << endl;

}



// InlineStudy.cpp : 定义控制台应用程序的入口点。

#include <iostream>

#include <iomanip>

#include "InlineStudy.h"

using namespacestd;

class B

{

public:

    B(Aa) :m_ca(a) {}

    inline voidFunB();

private:

    Am_ca;

};

inline voidB::FunB()

{

    m_ca.FunA();//调用A的内联方法

    cout<< "inline B" << endl;

int main()

{

    Aa;

    Bb(a);   

    b.FunB();

    return0;

}


在VS2003编译时,会提示这样的错误信息:InlineStudy error LNK2019: 无法解析的外部符号 "public: void __thiscall A::FunA(void)" (?FunA@A@@QAEXXZ) ,该符号在函数 "public: void __thiscall B::FunB(void)" (?FunB@B@@QAEXXZ) 中被引用。

经过调试修改发现:inline void FunA();的定义和声明在同一源文件中时,编译通过。感觉很奇怪,难道内联函数和模板函数一样声明和定义不能在两个源文件?百度一下后大概明白了原因。内联函数类似于宏函数,会被直接展开,调用时不会有堆栈创建与解退,因此当内联函数发生嵌套调用时,必须保证其声明和定义在同一源文件,调用者和被调者要在一个编译单元里(.obj)。