指向常量函数的指针的含义是什么?

指针可以声明为指向可变(非常量)数据或指向常量数据的指针。
可以将指针定义为指向函数。

我的同事和我正在讨论使用带有指针的“const”,并且出现了关于const与函数指针一起使用的问题。

以下是一些问题:

  1. 指向常量函数的指针与指向非常量函数的指针的含义是什么?
  2. 函数可以是常量吗?
  3. 函数可以是非const(可变)吗?
  4. 传递函数指针的正确(安全)语法是什么?

编辑1:函数指针语法

 typedef void (*Function_Pointer)(void); // Pointer to void function returning void. void function_a(Function_Pointer p_func); // Example 1. void function_b(const Function_Pointer p_func); // Example 2. void function_c(Function_Pointer const p_func); // Example 3. void function_d(const Function_Pointer const p_func); // Example 4. 

上述声明是将函数指针视为指向内部类型的指针的示例。

数据,变量或存储器指针允许上述组合。
所以问题是:函数指针是否具有相同的组合以及指向const函数的指针(例如示例2)是什么意思?

在C中,没有函数是const或其他的东西,所以指向const函数的指针是没有意义的(不应该编译,虽然我没有检查过任何特定的编译器)。

请注意,尽管它有所不同,但您可以拥有一个指向函数的const指针,一个指向函数返回const的指针等。基本上除了函数本身之外的所有东西都可以是const。 考虑几个例子:

 // normal pointer to function int (*func)(int); // pointer to const function -- not allowed int (const *func)(int); // const pointer to function. Allowed, must be initialized. int (*const func)(int) = some_func; // Bonus: pointer to function returning pointer to const void const *(*func)(int); // triple bonus: const pointer to function returning pointer to const. void const *(*const func)(int) = func. 

至于将指向函数的指针作为参数传递,它非常简单。 您通常只想将指针传递给正确的类型。 但是,指向任何类型函数的指针都可以转换为指向其他类型函数的指针,然后返回其原始类型,并保留原始值。

根据C规范( C99 ,第6.7.3节):

与限定类型关联的属性仅对作为左值的表达式有意义。

当规范说“限定类型”时,它表示使用constrestrictvolatile关键字定义的内容。 Snice函数不是左值, const上的const关键字没有意义。 您可能正在查看某种特定于编译器的扩展。 如果您尝试将函数声明为const某些编译器将抛出错误。

你确定你正在寻找一个指向常量函数的指针而不是一个指向函数的常量指针(也就是说,它是指针const ,而不是函数)?

关于#4:有关创建,传递和使用函数指针的有用概述,请参阅本指南 。

在C下,没有const函数这样的东西。 const是一个类型限定符,因此只能用于限定类型,而不是函数。 也许你的意思是指向函数的const指针或函数的非const指针?

在C ++中,方法可以是const 。 如果方法是const ,则意味着在调用该方法之后,包含该方法的对象将处于与调用该方法之前相同的状态(没有修改任何实例变量[1])。 因此,您可以指向const方法和非const方法,并且这些方法是不同的。

您可以将参数列表中的函数指针接受为retType (*variableName)(arguments)

[1]除非它们是mutable

在C中,如果你在GCC世界中,函数可以const ! 可以通过使用附加到函数声明和其他符号的属性将函数声明为const 。 它主要用于向编译器提供有关函数function的信息,即使它的主体不可用,以便编译器可以对它进行某种优化。

常数函数通常根据pure函数来定义。

纯函数是一种基本没有副作用的函数。 这意味着纯函数返回一个基于给定参数和全局内存计算的值,但不能影响任何其他全局变量的值。 纯函数不能合理地缺少返回类型(即具有void返回类型)。

现在我们可以定义什么是const函数,

不访问全局内存但只访问其参数的纯函数称为常量函数 。 这是因为与全局内存状态无关的函数在给定相同参数时将始终返回相同的值。 因此,返回值直接并且仅从给定参数的值导出。

这里const并不意味着任何关于函数可变性的东西。 但它是一种不触及全局记忆的function。 您可以为这些函数指定常规指针。 无论如何,代码区域一般(忘记自修改代码一段时间)是RO,你不能通过普通指针修改它。

阅读完整的见解文章 。

因此,当谈到GCC Constant函数时,我们讨论的是优化而不是函数可变性。

1.指向常量函数的指针与指向非常量函数的指针的含义是什么?

const和非const之间没有区别:函数本身不可修改

注意:在C ++中,如果函数是类的成员函数,则const表示不能更改此函数中对象的状态(分配给成员变量,调用非const memeber函数)。 在这种情况下,const关键字是成员函数签名的一部分,因此在指针方面有所不同。

2.一个函数可以是const吗?

往上看。

3.一个函数可以是非const(可变)吗?

往上看

4.传递函数指针的正确(安全)语法是什么?

所有指向自由函数的指针都可以转换为任何其他指向自由函数的指针(即它们的大小相同)。 所以你可以为(假设的)函数定义一个类型: void f(); 并将所有函数指针转换为此类型以进行存储。 请注意 ,您不应该通过这种常见类型调用该函数:您需要将其转换为其原始指针到函数类型,否则您将获得未定义的行为(并且很可能会崩溃)

对于C ++:不保证指向成员函数的指针可以转换为指向自由函数的指针

1.语法上没有任何地方可以放置’const’来使函数的内容保持不变。

无论你是不是const,你都会遇到’函数不是l值’的错误。

 typedef void (* FUNC)(void); FUNC pFunc; pFunc = 0; // OK *pFunc = 0; // error: Cannot assign to a function (a function is not an l-value) typedef void (* const FUNC)(void); FUNC pFunc; pFunc = 0; // error (const) *pFunc = 0; // error: Cannot assign to a function (a function is not an l-value) typedef void (const * FUNC)(void); // error:  (lol?) 

2&3。函数指针 – 是..函数内容,看起来不像。

4.我认为没有办法让函数指针传递更安全。 对于世界上所有的竞争,你唯一可以保护的是’SetCallback’不能改变它自己的参数本地副本。

 typedef void (* const FUNC)(void); void SetCallback(const FUNC const pCallback) { FUNC pTemp = pCallback; // OK (even though pTemp is not const!!) pCallback = 0; // error (const) }