内联函数调用错误

时间:2012-02-21 07:12:51

标签: c++ c linux g++

在一个头文件中,我有一个内联函数定义如下:

extern CMODEXPORT int FMI_invoke_delete_as_class
(
    FEATURE_RECORD_p_t frec,     /* I: Feature record */
    FMI_delete_fn_p_t  fn        /* I: Function pointer */
);

template<class T>
inline int FMI_invoke_delete_as_class(FEATURE_RECORD_p_t frec) // I: Feature record
{
  class FMIHelper
  {
    public:
      static int DeleteParms(FEATURE_RECORD_p_t frec)
      {
        //....
        return error;
      }
  };
  return FMI_invoke_delete_as_class(frec, &FMIHelper::DeleteParms);
}

在最后一行,有一个FMI_invoke_delete_as_class的电话 此函数在另一个.c文件中定义,如

extern int FMI_invoke_delete_as_class
(
    FEATURE_RECORD_p_t frec,     /* I: Feature record */
    OM_class_t         class_id  /* I: Object class */
)
{
    //...
}

extern int FMI_invoke_delete_as_class
(
    FEATURE_RECORD_p_t frec,     /* I: Feature record */
    FMI_delete_fn_p_t  fn        /* I: Function pointer */
)

如果头文件中的FMI_invoke_delete_as_class声明在我发布的内联函数之前,则内联函数的调用是可以的。但是,如果我在该内联函数之后放置该声明,则会在.c文件中调用错误的函数。 我不知道为什么,只是在linux下发生。

1 个答案:

答案 0 :(得分:0)

我尝试使用以下代码:

/** kk.h */
#include <iostream>
struct FEATURE_RECORD_p_t
{
    int kk;
};

template<class T>
inline int FMI_invoke_delete_as_class(FEATURE_RECORD_p_t frec) // I: Feature record
{
    class FMIHelper
    {
        public:
            static int DeleteParms(FEATURE_RECORD_p_t frec)
            {
                //....
                std::cout << "DeleteParms" << std::endl;
                frec.kk = 100;
                return frec.kk;
            }
    };

    std::cout << "FMI_invoke_delete_as_class<>" << std::endl;
    return FMI_invoke_delete_as_class(frec, &FMIHelper::DeleteParms);
}

typedef int (*FMI_delete_fn_p_t)(FEATURE_RECORD_p_t);

extern int FMI_invoke_delete_as_class
(
    FEATURE_RECORD_p_t frec,     /* I: Feature record */
    FMI_delete_fn_p_t  fn        /* I: Function pointer */
);

#include "kk.h"
extern int FMI_invoke_delete_as_class
(
    FEATURE_RECORD_p_t  frec,     /* I: Feature record */
    int                 class_id  /* I: Object class */
)
{
    std::cout << "FMI_invoke_delete_as_class (bad)" << std::endl;
    return 0;
}

extern int FMI_invoke_delete_as_class
(
    FEATURE_RECORD_p_t frec,     /* I: Feature record */
    FMI_delete_fn_p_t  fn        /* I: Function pointer */
)
{
    std::cout << "FMI_invoke_delete_as_class" << std::endl;
    return fn(frec);
}

int main()
{
    FEATURE_RECORD_p_t kk;

    FMI_invoke_delete_as_class<int>(kk);
    return 0;
}

并打印结果为:

FMI_invoke_delete_as_class<>
FMI_invoke_delete_as_class
DeleteParms

它接缝好了。你如何调用内联函数?你的类型定义如何?你的编译命令是哪个?我正在使用g++ (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42) g++ -g -o kk kk.cpp命令行