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 ++中的未知构造/变量声明[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C 中的变量声明

C中的局部静态变量范围[重复]

C语言中的32个关键字

C语言中的32个关键字

C 中的变量声明位置

c语言怎样声明和定义全局变量