一种奇怪的函数声明写法

typedef定义函数类型的函数声明写法

最近网友遇到个问题:

typedef void(FunType)(int);
FunType a;

这种写法,a是的什么东西,可以编译通过,用gcc测试输出a,结果是1。

但是msvc,尝试输出a时会报错,int a(int,int)无法解析的外部符号之类的。

还好msvc的错误比较明确,既然是a的链接出了问题,尝试在别处写个定义:

void a(int){
    
    
}

编译通过,msvc输出变成了函数地址。

结论

通常都是定义函数指针类型:

typedef void(*FunPtr)(int);
FunPtr a = someFunction;
// 或者
typedef void(FunType)(int);
FunType * a = someFunction;

实际FunType a,就是一条声明语句,声明一个函数名是a且返回类型和参数类型跟FunType一致的函数。此时等同于

void a(int);

其实参照通常我们 “定义” 变量的时候的写法:int a; 对应的FunType a; 就比较好理解,就是一句函数声明。

能想到的用途是,如果代码里有很多相同返回类型和参数和参数列表的函数,使用的时候需要提前声明,可以预先定义一个函数类型,
再通过FunType funcName; 的方式声明,少写代码。

猜你喜欢

转载自blog.csdn.net/eiilpux17/article/details/124852806
今日推荐