2012-06-15 64 views
4

在一些Bison代码中,以下行代表什么意思?这段代码在C中的含义是什么?

#define YY_DECL extern "C" int yylex(); 

我知道#define命令,但我不明白整个命令。

+1

难道那是'':''应该在行尾吗? –

+0

我用''替换':',但是更常规的是没有分号,所以当你写:'YYDECL;'时,不会有分号分号在预处理的代码中。 –

回答

6

这意味着YY_DECL将扩大到

extern "C" int yylex(); 

这实际上是C++,不是C;当您使用C++编译器编译此文件时,它声明函数yylex必须使用“C链接”进行编译,以便C函数可以毫无困难地调用它。

如果你不用C++编程,这在很大程度上与你无关,但是你可能会遇到类似C库头文件的声明,这些库试图与C++兼容。 C和C++可以在一个程序中混合使用,但它需要这些声明才能很好地协同工作。

可能有一个#ifdef __cplusplus围绕此#define;这是一个特殊的宏,用于表示C++编译器的编译。

2

#define - 为预处理器声明一个新变量的预处理器指令。但你知道。

YY_DECL - 变量的名称。

extern "C" - 告诉编译器,下面的代码是纯C的。C和C++之间有很多不同,通常不能混合使用C和C++代码。如果将它包含在声明中,它允许您在C++中使用C.编辑:代码实际上不需要是纯粹的C,但它会像这样链接。但最常见的使用模式是使C代码与C++兼容。感谢@larsmans的更正。

int yylex() - 名为yylex用的参数未定义数量和返回类型int

函数的声明所以整个命令给C函数声明预处理器变量。

+3

'extern“C”'没有声明“纯C”,它只声明了C linkage * *。就C++编译器而言,该函数的主体可以使用任意的C++特性。 –

3
#define YY_DECL extern "C" int yylex(); 

定义一个宏YY_DECL静置具有“C” C++程序内部链接的函数yylex的声明,不接受参数并且返回一个int