2016-11-10 76 views
1

我已经经历了一些头文件,看到有许多函数原型是这样的:如何在原型中用__P调用函数?

returntype some_name __P(arguments); 

如果我要调用这个函数我该怎么办呢?我是否使用类似

some_name(arguments); 

不包括__P,或者是否有其他方式可以调用此类函数?

+0

你可以链接包含的头文件,以便我们看看它吗? –

+0

你在哪里找到这样的声明?你能展示一个吗?它可能是一个扩展到某种东西的宏。 – Banex

+0

这是链接到头文件[链接](web.mit.edu/~jik/sipbsrc/i386_nbsd1/webster/src/server/dbm/PORT/sys/db.h/)它有一些像void \t __dbpanic __P((DB * dbp));我该如何叫__dbapanic?只是__dapanic(* dbp)或以其他方式 –

回答

4

这种类型的原型使用宏__P允许在不支持C90原型的非常旧的系统(也称为ansi原型)中包含和编译。

在大多数系统中,参数在__P宏扩展到参数列表,如下图所示:

#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[]);

只要忽略__P宏并使用some_name(arguments);语法来调用该函数。还请注意,宏名称__P不重要,包的作者可以使用任何名称来达到此目的。

+0

所以这是一些石器时代的遗产?有意思的是,为了避免将代码移植到中间值C,API至少需要做些什么... – Olaf

+1

@Olaf通常情况下,避开的人是不一样的,他们正在努力。 –

+0

@EugeneSh .:可能是商业库。但是,一个仍然使用这种(甚至是新的)客户应该考虑三次,因为这样的遗留物通常会隐藏更深层次的问题(如不良维护)。如果原始开发人员不再可用并且没有人真正了解代码,那么这些黑客通常会添加到(libs或usier code)中。 – Olaf

相关问题