3

我需要将 .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|
4

2 回答 2

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)

我认为您的新错误“未定义对 main 的引用”与所提出的问题无关。有关一些想法,请参见这篇文章

于 2013-03-17T00:24:51.243 回答
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.

于 2013-03-17T00:57:14.170 回答