这种typedef是否意味着它的作用?

时间:2014-07-24 19:31:07

标签: c++ typedef

我相信我理解这一点,但我想得到一些确认。

typedef int (NewTypeName) (arg_type* t);

对于我的未定,这个类型定义允许人们容易地声明带有类型为arg_type *的1个参数并返回int的函数。要在头文件中声明这些函数,可以写:

NewTypeName func1;
NewTypeName func2;

但是,在.cpp文件中定义这些函数时,我会这样做:

int func1(arg_type* t) {
  //do something
  return 1;
}

我是否正确理解了这一点?

2 个答案:

答案 0 :(得分:5)

是的,这正是您认为的意思,是的,typedef只能用于非定义的声明。

请注意,括号在这里是不必要的和不寻常的:更常见的写法是

typedef int NewTypeName (arg_type* t);

只有在需要指向函数指针的typedef:

时才需要括号
typedef int (*NewTypeName) (arg_type* t);

正如您对问题的评论所示,您所拥有的内容很容易被误读。

这样的typedef几乎总是不必要的,虽然它们在处理指向函数的参数或返回类型时可以提高可读性:C函数signal可以声明为

typedef void sighandler(int);
sighandler *signal(int signum, sighandler *handler);

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

void (*signal(int sig, void (*func)(int)))(int);

你告诉我,哪个更具可读性?我猜你不会选择第三种选择。

有一种情况需要使用typedef:虽然编译器中通常没有实现,但C ++编译器应该将具有C链接的函数视为与C ++链接的函数不同的类型。名称的联系是普遍实现的,但类型的联系很少。拥有一个模板函数是很有用的,它不能有C链接,但仍然给它一个具有C链接的类型。这需要一个typedef:

extern "C" {
typedef void func_t();
};
template <typename> func_t myfunc;
template <typename T> void myfunc(void) { /* your definition here */ }

答案 1 :(得分:2)

这是完全正确的,但你真的不应该声明这样的功能。它只会让人迷惑。问题是使用typedef无法定义函数,因此声明和定义不一致。