为什么C ++中的静态函数原型参数被ARGS()包围?

时间:2017-08-03 11:30:30

标签: c++ compilation prototype

我试图与其他人的C ++代码合作,并且因为一种阻止代码编译的奇怪语法而感到茫然。

在他们提供的许多.c文件中,他们都有静态函数的原型,如下所示:

static DdNode * extraZddIsopCoverRandom  ARGS((DdManager * dd, DdHashTable * table, DdNode * bOn, DdNode * bOnDc, int * pPerm, int cVar));
static int * extraGenerateRandomPermutation ARGS((int nVars));
static void     cuddHashTableQuitZdd2(DdHashTable * hash);

不是全部,但是一大块函数在参数周围有ARGS()语法,这会导致编译器吐出这样的错误消息:

extraZddIsop.c:50: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ARGS’

我认为与ARGS()相关的所有函数也会出现这样的错误:

extraZddIsop.c: At top level:
extraZddIsop.c:1217: error: conflicting types for ‘extraZddIsopCoverRandom’
extraZddIsop.c:161: note: previous implicit declaration of ‘extraZddIsopCoverRandom’ was here
extraZddIsop.c:1500: error: conflicting types for ‘extraGenerateRandomPermutation’
extraZddIsop.c:155: note: previous implicit declaration of ‘extraGenerateRandomPermutation’ was here

当我在这些块周围移除ARGS()时,错误消失了,而且它似乎正在编译,但是有很多这样的错误,我担心我必须把某些东西弄得一团糟,这会导致以后的错误删除它们。这对Google来说似乎也是一个绝对不可能的问题,因为" args"经常在其他环境中使用。有谁知道为什么会那样?

我可以根据要求给出函数的定义,但我主要想知道这个ARGS()可能是什么,所以我希望它们不相关。

1 个答案:

答案 0 :(得分:2)

这看起来像是一个迎合古老的预标准C编译器的技巧。这些不处理函数原型(特别是类型化的参数列表)。因此,宏可以定义为:

Something func();

...之后所有函数都声明为ARGS,C编译器将其识别为带有未指定参数的函数。对于其他C(和C ++)编译器,#define ARGS(list) list 可以定义为:

ARGS()

...它只是剥离var date = new DateTime(2017, 8, 3); var formattedDate = $"{date:dd-MM-yyyy}"; 并使原型保持不变。如果您使用的是千年C编译器或C ++编译器,那么您应该这样做。