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

标签 c++ compilation prototype

我正在尝试使用其他人的 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/

相关文章:

c++ - 如何正确使用结构中的 const 字符串指针?

vb6 - 将 VB6 程序编译为 Native 或 POSIX 应用程序?

javascript - 为什么大多数 javascript 框架都使用对象字面量

javascript - 为什么 Set 的原型(prototype)方法在调用 Object.create(Set.prototype) 时会抛出错误

java - 关于java编译

javascript - 为什么在 JavaScript 对象中使用公共(public)方法?

c++ - 顺序 'new' 运算符是否会分配连续的内存?

c++ - 我可以像这样混合使用 pimpl 和 C 接口(interface)吗?

c++ - 这是使用 strerror_r 的正确方法吗?

xcode - Xcode 4 中的跨项目源代码引用