我正在尝试理解使用 typedef 的函数声明。
这段代码在 C++ 中做了什么?
typedef void fcn_t(void);
typedef void (*ptr_t)(void);
fcn_t f;
fcn_t *pf;
ptr_t pf2;
据我了解:
fcn_t
是一个函数的类型,所以带有f
的行是一个函数声明(不是定义),我稍后可以将其定义为void f(void) { blabla();气泡(); }
就好像我声明了void f(void);
而不是fcn_t f;
;fcn_t *
是函数指针的类型,pf
那一行是指针变量定义,pf
是默认初始化的(假设代码摘录来自全局范围);fcn_t*
和ptr_t
没有区别,因此我所说的关于pf
的一切都适用于pf2
.
我做对了吗?如果我将它们标记为 extern
,这三个声明中的任何一个的含义都会改变吗?如果将代码编译为 C 而不是 C++,会有什么变化?
最佳答案
是的,您在这三个方面都是正确的。如果将它们标记为 extern
,唯一会改变的是函数指针。在 C++ 中,函数声明默认为 extern
。
尝试编译下面的程序
template <typename...>
struct WhichType;
typedef void fcn_t(void);
typedef void (*ptr_t)(void);
// constexpr auto one = WhichType<fcn_t>{};
// constexpr auto two = WhichType<fcn_t*>{};
// constexpr auto three = WhichType<ptr_t>{};
fcn_t f;
void f() {}
int main() {
f();
}
取消对注释行的注释可能会给您一个编译器错误,告诉您 WhichType
实例被实例化的类型,因此它应该向您显示所有这三样东西的确切类型问到。这是我从 Scott Meyers 的书“Effective Modern C++”中学到的一个技巧。
要测试声明是否为外部声明,编写两个简单的实现文件,其中一个包含变量的定义
main.cpp
template <typename...>
struct WhichType;
typedef void fcn_t(void);
typedef void (*ptr_t)(void);
fcn_t f;
int main() {
f();
}
定义.cpp
void f() {}
然后编译、链接并运行definition.cpp
和main.cpp
(通过g++ -std=c++14 definition.cpp main.cpp
然后是 ./a.out
)。如果声明不是 extern,则编译将失败并出现 undefined symbol 错误。
关于c++ - Typedef 函数与函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44148406/