我需要将.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|
答案 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
中的嵌套类型