c++ - Typedef 函数与函数指针

标签 c++ c function-pointers declaration

我正在尝试理解使用 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.cppmain.cpp(通过g++ -std=c++14 definition.cpp main.cpp 然后是 ./a.out)。如果声明不是 extern,则编译将失败并出现 undefined symbol 错误。

关于c++ - Typedef 函数与函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44148406/

相关文章:

c - 尝试同步 GTK 条目时无限循环

c - int 变量在 'while' 循环后更改为 1

c++ - 使用函数指针专门化模板,这取决于模板参数

c - 尝试清除缓冲区后继续出现段错误?

函数模板参数的C++模板实例化

c++ - 没有调用 getline(std::istream&, int&) 的匹配函数

c++ - winapi mouse_event 错误坐标

c++ - 如何使用指针按值传递?

c - 在 solaris 内核模块中获取进程 ID 和父进程

c++ - 从特定文件获取函数指针