C ++中的未知构造/变量声明[重复]
Posted
技术标签:
【中文标题】C ++中的未知构造/变量声明[重复]【英文标题】:unknown construct/variable declaration in c++ [duplicate] 【发布时间】:2020-10-06 11:01:43 【问题描述】:我对 c++ 还很陌生。我在一般编程方面有一些经验,特别是在 C 方面。 我有一个由其他人编写的 c++ 项目,我目前正在尝试理解它,它包含几个这种格式的变量声明:
uint64_t(*const col_timestamp)(const uint8_t* col_buf);
我无法理解这意味着什么。它甚至是一个变量声明吗?我会理解常量指针col_timestamp
指向uint64_t
类型变量和指针col_buf
指向const uint8_t
类型变量的两个单独声明,如下所示:
uint64_t * const col_timestamp;
const uint8_t * col_buf;
但我不认为这就是它的意思,因为那时我没有看到以这种方式编写它的理由。非常感谢您的帮助,因为我有点卡在这里。
如果这是一个重复的问题,我很抱歉,但我根本不知道要搜索什么,我想这对于熟悉 c++ 的人来说很容易回答。
提前致谢!
【问题讨论】:
欢迎来到 ***。是的,您偶然发现了 C 函数指针语法的大杂烩,C++ 也支持该语法。幸运的是,您在 C++ 中不再需要它们,因为您有std::function
和模板参数(如 std::copy_if
使用)之类的东西。但是,既然您知道它实际上是什么,那么链接的副本应该可以回答您的大部分问题。
感谢您的快速回复!我明白了,所以这是一个将指针作为参数的函数指针的声明?这有点奇怪,因为同一个项目也使用了相当多的模板代码。你知道在函数模板上使用函数指针有什么好处吗?
在我看来没有任何好处,实际上与函数模板参数相比,没有任何性能优势,实际上AFAIK函数模板参数有利于运行时性能。这就是说对于编译时绑定的函数参数,如果你想在运行时绑定函数,std::function
是要走的路。
【参考方案1】:
这个
uint64_t(*const col_timestamp)(const uint8_t* col_buf);
是一个指向函数的常量指针的声明,该函数具有返回类型uint64_t
和一个const uint8_t *
类型的参数。
例如,如果你有一个声明为类似的函数
uint64_t func_col_timestamp( const uint8_t *col_buf );
你可以声明和初始化一个指向函数的指针
uint64_t(*const col_timestamp)(const uint8_t* col_buf) = func_col_timestamp;
【讨论】:
我明白了,谢谢!但是初始化不应该是 uint64_t(const col_timestamp)(const uint8_t col_buf) = &func_col_timestamp,因为我们正在初始化一个指针? @hoefes96 表达式中使用的函数指示符(如初始化程序)被隐式转换为指向函数的指针。所以使用运算符 & 是多余的。以上是关于C ++中的未知构造/变量声明[重复]的主要内容,如果未能解决你的问题,请参考以下文章