将C转换为C ++:typedef生成错误

时间:2013-03-17 00:14:04

标签: c++ c typedef

我需要将.c文件转换为.cpp文件,我遇到了这个声明:

 typedef void handler_t(int);

 handler_t *Signal(int signum, handler_t *handler);

我在头文件中包含了这两行代码,并在.cpp文件中添加了实际的函数声明函数。

 handler_t *Signal(int signum, handler_t *handler){ ...... } 

当我这样做时,我得到错误:“handler_t没有命名类型”。我之前从未使用过C或C ++中的typdef,所以有人可以向我解释为什么我会收到错误吗?


我的课程要求:

 #ifndef A_H
 #define A_H

 class A
 {
     public:
       A();
       virtual ~A();

       typedef void handler_t(int);
       handler_t* Signal(int signum, handler_t *handler);

     protected:
     private:
 };

   #endif // A_H

/////////////

   #include "A.h"

   A::A()
   {
   }

   A::~A()
   {
   }

   handler_t* A::Signal(int signum, handler_t *handler) {

     ...........

    }

错误:

    |694|error: ‘handler_t’ does not name a type|

2 个答案:

答案 0 :(得分:2)

尝试将其更改为:

typedef void (*handler_t)(int);

handler_t Signal(int signum, handler_t handler);

如需参考,请查看signal(),其内容如下:

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

实际上,看看你的新代码,我认为你必须这样做:

A::handler_t* A::Signal(int signum, A::handler_t *handler)

我认为您的新错误“未定义的主要参考”与提出的问题无关。有关一些想法,请参阅this post

答案 1 :(得分:0)

handler_t* A::Signal(int signum, handler_t *handler) {

问题是首次提及handler_t需要使用A::进行限定。像这样:

A::handler_t* A::Signal(int signum, handler_t *handler) {

当类中定义的类型用作成员函数的返回类型时,总是如此。当您在类定义中声明函数时,嵌套的typedef是已知的。如果在类定义中定义函数,它也是一样的。但是一旦你走出类定义,就必须告诉编译器定义handler_t的位置。但第二次提到handler_t是可以的,因为此时编译器知道它正在编译A的成员函数,并且它知道A中的嵌套类型