我正在尝试使用其他人的 C++ 代码,但被一种阻止代码编译的奇怪语法弄糊涂了。
在他们提供的许多 .c 文件中,他们都有静态函数的原型(prototype),如下所示:
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
当我删除这些 block 周围的 ARGS() 时,错误消失了,它似乎正在编译,但是有这么多,我担心我一定是搞砸了一些可怕的东西,删除它们会导致以后的错误.这对谷歌来说似乎也是一个绝对不可能的问题,因为“args”在其他上下文中使用得如此频繁。有谁知道为什么会出现这种情况?
我可以根据要求给出函数的定义,但我主要只是想知道这个 ARGS() 可能是什么,所以我希望它们不相关。
最佳答案
这看起来像是迎合古老的准标准 C 编译器的技巧。这些不处理函数原型(prototype)(特别是类型化参数列表)。因此,宏可以定义为:
#define ARGS(list) ()
... 之后所有函数都声明为 Something func();
,C 编译器将其识别为采用未指定参数的函数。对于其他 C(和 C++)编译器,ARGS
可以定义为:
#define ARGS(list) list
... 只是剥离了 ARGS()
并保持原型(prototype)不变。如果您使用本世纪的 C 编译器或 C++ 编译器,那么您应该这样做。
关于c++ - 为什么 C++ 中的静态函数原型(prototype)参数会被 ARGS() 包围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45482939/