我已经经历了一些头文件,看到有许多函数原型是这样的:如何在原型中用__P调用函数?
returntype some_name __P(arguments);
如果我要调用这个函数我该怎么办呢?我是否使用类似
some_name(arguments);
不包括__P
,或者是否有其他方式可以调用此类函数?
我已经经历了一些头文件,看到有许多函数原型是这样的:如何在原型中用__P调用函数?
returntype some_name __P(arguments);
如果我要调用这个函数我该怎么办呢?我是否使用类似
some_name(arguments);
不包括__P
,或者是否有其他方式可以调用此类函数?
这种类型的原型使用宏__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
不重要,包的作者可以使用任何名称来达到此目的。
你可以链接包含的头文件,以便我们看看它吗? –
你在哪里找到这样的声明?你能展示一个吗?它可能是一个扩展到某种东西的宏。 – Banex
这是链接到头文件[链接](web.mit.edu/~jik/sipbsrc/i386_nbsd1/webster/src/server/dbm/PORT/sys/db.h/)它有一些像void \t __dbpanic __P((DB * dbp));我该如何叫__dbapanic?只是__dapanic(* dbp)或以其他方式 –