在某些 Bison 代码中,以下行是什么意思?
#define YY_DECL extern "C" int yylex();
我知道#define
命令,但我不了解整个命令。
这意味着YY_DECL
将扩大到
extern "C" int yylex();
这实际上是 C++,而不是 C;当你用 C++ 编译器编译这个文件时,它声明该函数yylex
必须用“C 链接”编译,以便 C 函数可以毫无问题地调用它。
如果您不使用 C++ 编程,这在很大程度上与您无关,但您可能会在尝试与 C++ 兼容的库的 C 头文件中遇到类似的声明。C 和 C++ 可以混合在一个程序中,但它需要这样的声明才能使函数很好地协同工作。
#ifdef __cplusplus
周围可能有一个#define
;这是一个特殊的宏,用于指示 C++ 编译器的编译。
#define YY_DECL extern "C" int yylex();
定义一个宏,代表在 C++ 程序中具有“C”链接YY_DECL
的函数的声明,不接受任何参数并返回一个.yylex
int
#define
- 为预处理器声明一个新变量的预处理器指令。但你知道的。
YY_DECL
- 变量的名称。
extern "C"
- 告诉编译器以下代码是纯 C。C 和 C++ 之间有很多差异,一般不能混合 C 和 C++ 代码。如果将其包含在声明中,它允许您在 C++ 中使用 C。编辑:代码实际上不需要是纯 C,但它会这样链接。但最常见的使用模式是使 C 代码与 C++ 兼容。感谢@larsmans 的更正。
int yylex()
yylex
-以未定义数量的参数和返回类型命名的函数的声明int
因此,整个命令将 C 函数声明分配给预处理器变量。