C 如何在原型中使用_P调用函数?

C 如何在原型中使用_P调用函数?,c,header-files,C,Header Files,我已经浏览了一些头文件,看到有许多类似这样的函数原型: returntype some_name __P(arguments); 如果我调用这个函数,我该怎么做?我会用类似的东西吗 some_name(arguments); 排除\uu p,或者是否有其他方法调用此类函数?此类原型使用宏\uu p允许在不支持C90原型(又称ansi原型)的非常旧的系统上包含和编译 在大多数系统上,\up宏的参数扩展到参数列表,如下所示: #ifdef __USING_STONE_AGE_COMPILER__

我已经浏览了一些头文件,看到有许多类似这样的函数原型:

returntype some_name __P(arguments);
如果我调用这个函数,我该怎么做?我会用类似的东西吗

some_name(arguments);

排除
\uu p
,或者是否有其他方法调用此类函数?

此类原型使用宏
\uu p
允许在不支持C90原型(又称ansi原型)的非常旧的系统上包含和编译

在大多数系统上,
\up
宏的参数扩展到参数列表,如下所示:

#ifdef __USING_STONE_AGE_COMPILER__
#define __P(args)  ()
#else
#define __P(args)  args

int some_name __P((int argc, char *argv[]));
在过时的系统上,上述声明扩展为
int some_name()而它扩展到完整的原型,否则:
int some_name(int argc,char*argv[])


只需忽略
\u p
宏并使用
一些名称(参数)调用函数的语法。还要注意,宏名
\uu P
并不重要,程序包的作者可以为此使用任何名称。

能否链接包含该名称的头文件,以便我们查看它?您在哪里找到此类声明?你能给我看看吗?它可能是一个扩展到某个内容的宏。这是指向头文件[link](web.mit.edu/~jik/sipbsrc/i386_nbsd1/webster/src/server/dbm/PORT/sys/db.h/)的链接,它有一些类似于void u dbpanic u P((db*dbp));我怎么叫恐慌?只是uuu dapanic(*dbp)或以其他方式这是石器时代的遗产?有趣的是,ppl为了避免将代码移植到中世纪C而做出的努力至少…@Olaf通常避免移植的人与做出努力的人不同。@EugeneSh:可能是为了商业LIB。但是,仍然使用这种(甚至是新的)产品的客户应该三思而后行,因为这种遗留产品往往隐藏着更深层次的问题(比如糟糕的维护)。如果原始开发人员不再可用,并且没有人真正理解代码,则这些黑客通常会添加到(libs或usier代码)中。@Olaf:我同意。它可能表示标头本身非常旧。用于过时目标的非常旧的编译器仍然用于维护目的。但即使是出于这个目的,使用外部工具删除或重写一些较新的构造也是一个更好的选择。如果这是某个产品库的标题,那就太可怕了。它比注释所暗示的更糟糕-将函数声明为
func()
会产生与将其声明为
func(type1 arg1、type2 arg2、type3 arg3)截然不同的结果。
。如果声明与代码的实际定义(假定在编译库中)不匹配,则调用该函数的结果将是未定义的行为。如果报头是由知道如何处理已编译库的人分发的,则报头中唯一可能的声明将与实际交付的实现相匹配。