在一些Bison代码中,以下这行是什么意思?
#define YY_DECL extern "C" int yylex();
我知道 #define
命令,但我不太理解整个命令的含义。
YY_DECL
将被扩展为:extern "C" int yylex();
yylex
必须使用“C链接”进行编译,以便C函数可以无障碍地调用它。#define
周围可能有一个#ifdef __cplusplus
;这是一种特殊的宏,用于指示由C ++编译器编译。#define YY_DECL extern "C" int yylex();
定义一个宏 YY_DECL
,用于在C++程序中声明具有“C”链接的函数yylex
,该函数不带参数且返回一个int
。
#define
- 预处理器指令,声明一个新的变量给预处理器。但你已经知道了。
YY_DECL
- 变量的名称。
extern "C"
- 告诉编译器以下代码是纯C语言。C和C++之间有很多区别,一般情况下不能混用C和C++代码。如果在声明中包含这个,它允许你在C++中使用C语言。编辑:实际上代码不需要是纯C,但会被链接为纯C。但最常见的用法是让C代码与C++兼容。感谢@larsmans的更正。
int yylex()
- 声明一个名为yylex
的函数,其参数数量未定义,返回类型为int
因此,整个命令将一个C函数声明分配给一个预处理器变量。
':'
应该在行末吗? - Niall C.:
替换为;
,但更常规的做法是不使用分号,因此当您编写YYDECL;
时,在预处理代码中不会出现多余的分号。 - Jonathan Leffler