繁体   English   中英

在C ++中指向C函数的指针的Typedef

[英]Typedef for a pointer to a C function inside C++

我正在尝试声明一个指定C调用约定的函数指针类型 (不是变量)。

extern "C" typedef void (*PFunc)();

typedef extern "C" void (*PFunc)();

在函数级别使用时会产生语法错误。

extern "C" { typedef void (*PFunc)(); }
extern "C" typedef void (*PFunc)();

在全球范围内使用时都起作用; 我宁愿保持本地化。

请问有什么正确的方法? 我不想使用特定于编译器的扩展。

根据一点,在调用被称为extern "C"非正常函数时,指针和目标之间的调用约定是安全的,因为C和C ++调用约定可能不匹配。 在现实生活中,他们大多不会,但仍然是正确的。

与一些评论者在这里所说的相反,调用约定/链接函数类型的一部分。 它必须是,否则通过函数指针调用函数时将不知道此信息:

[C++11: 7.5/1]:所有函数类型,具有外部链接的函数名称和具有外部链接的变量名称都具有语言链接。 [..]

正确的声明是:

extern "C" typedef void (*PFunc)();

但是,在块作用域中,您不能声明函数具有任何链接:

[C++11: 7.5/4] :链接规范嵌套。 当链接规范嵌套时,最里面的规则确定语言链接。 链接规范不会建立范围。 链接规范只应在命名空间范围内发生(3.3)。 链接规范中 ,指定的语言链接适用于所有函数声明符的函数类型,具有外部链接的函数名称,以及在链接规范中声明的具有外部链接的变量名称。 [..]

因此,您必须坚持使用命名空间范围声明。 如果您仍想限制声明的可见性,则可以使用未命名命名空间将其“隐藏”在同一转换单元中的其他代码中。

是的,链接规范( extern "C" )应该在Standard的范围内(或全局)。
extern "C" typedef void (*pf)();
是正确的。 如果您的编译器不接受它,那么它就是编译器的错误。

猜测,但可能是因为你将函数声明为(),在C中表示它可以同时使用INT和VOID ...尝试明确说出(void)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM