我相信我理解这一点,但我想得到一些确认。
typedef int (NewTypeName) (arg_type* t);
对于我的未定,这个类型定义允许人们容易地声明带有类型为arg_type *的1个参数并返回int的函数。要在头文件中声明这些函数,可以写:
NewTypeName func1;
NewTypeName func2;
但是,在.cpp文件中定义这些函数时,我会这样做:
int func1(arg_type* t) {
//do something
return 1;
}
我是否正确理解了这一点?
答案 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无法定义函数,因此声明和定义不一致。