我试图与其他人的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()可能是什么,所以我希望它们不相关。
答案 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 ++编译器,那么您应该这样做。