我是新手c。我正在尝试通读 Holub 的Compiler Design In C. 在set.c本书附录 A 中调用的文件中,作者使用了function prototype如下所示的声明。
extern int _addset P((SET* , int ));
Run Code Online (Sandbox Code Playgroud)
这在我编译期间失败。下面列出了错误。我正在使用gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4.
include/tools/set.h:25:37: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘P’
extern void delset P((SET* ));
Run Code Online (Sandbox Code Playgroud)
当我如下所示更改声明时,代码会编译。
extern int _addset(SET* , int );
Run Code Online (Sandbox Code Playgroud)
由于我不太熟悉c,因此我不确定通过更改这样的代码是否做错了什么。谁能告诉我上述语法是否有效,为什么书中的语法不能编译?Holub 确实强调了使用 ANSI C 的重要性,但根据我所读到的 GCC 符合 ANSI(或更准确地说是 ISO)。
问题是P预处理器宏。C 书中的编译器设计很旧,因此作者为类似的旧(现在古老)编译器提供了有关参数列表的解决方法。这本书描述了它的用途:
行 25 和 28 上的 P 宏处理另一个与 ANSI 相关的可移植性问题。许多编译器(包括许多 UNIX 编译器)无法处理函数原型。如果 ANSI 未定义,该宏使用类似于前面讨论的 D() 宏的机制将原型转换为简单的 extern 声明。例如,给定以下输入:
Run Code Online (Sandbox Code Playgroud)int dimitri P(( int x, long y ));如果定义了 ANSI,则 P (x) 宏计算其参数和以下转换结果:
Run Code Online (Sandbox Code Playgroud)int dimitri ( int x, long y );否则,宏丢弃其参数并计算为 () ,因此将创建以下内容:
int dimitri ();
这个想法是,如果你有一个符合 ANSI 标准的编译器,你应该#define ANSI在包含定义P. 然后P单独留下您的参数列表。但是,如果您没有符合 ANSI 标准的编译器,则无需定义ANSI并且预处理器会删除您的参数列表。 P看起来像这样:
#ifdef ANSI
#define P(x) x
#else
#define P(x) ()
#endif
Run Code Online (Sandbox Code Playgroud)
我建议P像你一样完全删除。但是,您也可以#define ANSI或者#define P(x) x如果您希望能够按原样复制并粘贴本书中的代码。
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |