将函数指针传递给静态函数是否可能/安全/合理?

ELL*_*BLE 10 c static function-pointers extern linkage

假设我只想通过传递一个函数指向该函数来从我的一个文件中公开一个函数.声明该函数是否安全static?编译器是否允许进行任何使我的函数指针无效的柔道,或者在该文件的上下文之外使其无意义,因为该函数被声明为特定于该文件?

不是我的代码,而是一个(愚蠢)我的意思的例子:

void    static   cool_function(void);
void    extern (*cool_function_ptr)(void); // Actually, I’m not sure of where the `extern` goes in a function-
                                           // pointer declaration. Damn you, confusing function-pointer syntax!
Run Code Online (Sandbox Code Playgroud)

鉴于该代码(或其语法正确的近似),cool_function_ptr从另一个文件访问是否非法?

R..*_*R.. 11

这样做是完全安全的,而且通常很有用.这同样适用于static变量和数据指针.如果编译器想要做任何可能干扰通过来自不同转换单元的函数指针调用函数的能力的花哨优化(如非标准调用约定,内联,重构等),则编译器有责任确定从不采用函数的地址,或者生成代码的多个版本,其中一个版本可以安全地使用标准调用约定从外部调用.

  • 这一直在使用,例如在填充表示由多个模块(例如:内核中的文件系统)实现的公共API的函数指针的结构时. (3认同)