我试图声明将指定C调用约定的函数指针类型(而不是变量)。两个都
extern "C" typedef void (*PFunc)();
和
typedef extern "C" void (*PFunc)();
在功能级别上使用时,会产生语法错误。
extern "C" { typedef void (*PFunc)(); }
extern "C" typedef void (*PFunc)();
在全局范围内使用时,两者都可以工作;我宁愿将其保留在本地。
请问正确的方法是什么?我不想使用编译器特定的扩展。
根据此,指针和目标之间的匹配调用约定是inderectly调用被声明为函数时做安全的事情extern "C"
,因为C和C ++调用约定可能不匹配。在现实生活中,它们大多不正确,但仍然正确。
与某些评论者在这里所说的相反,调用约定/链接是函数类型的一部分。必须如此,否则在通过函数指针调用函数时将不知道此信息:
[C++11: 7.5/1]:
所有函数类型,具有外部链接的函数名称以及具有外部链接的变量名称均具有语言链接。[..]
正确的声明是:
extern "C" typedef void (*PFunc)();
但是,在块范围内,您不能声明一个函数具有任何链接:
[C++11: 7.5/4]
:链接规范嵌套。当链接规范嵌套时,最里面的一个确定语言链接。链接规范未建立范围。甲联动说明书应仅在命名空间范围(3.3)发生。在链接规范中,指定的语言链接适用于所有函数声明符的函数类型,具有外部链接的函数名称以及具有在链接规范内声明的具有外部链接的变量名。[..]
因此,您将必须遵守命名空间范围声明。如果您仍然想限制声明的可见性,则可以使用未命名的namespace将其与同一翻译单元中的其他代码“隔离”起来。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句