4

在某些 Bison 代码中,以下行是什么意思?

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

我知道#define命令,但我不了解整个命令。

4

3 回答 3

6

这意味着YY_DECL将扩大到

extern "C" int yylex();

这实际上是 C++,而不是 C;当你用 C++ 编译器编译这个文件时,它声明该函数yylex必须用“C 链接”编译,以便 C 函数可以毫无问题地调用它。

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

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

于 2012-06-15T20:18:55.750 回答
3
#define YY_DECL extern "C" int yylex();

定义一个宏,代表在 C++ 程序中具有“C”链接YY_DECL的函数的声明,不接受任何参数并返回一个.yylexint

于 2012-06-15T20:20:13.497 回答
2

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

YY_DECL- 变量的名称。

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

int yylex()yylex-以未定义数量的参数和返回类型命名的函数的声明int

因此,整个命令将 C 函数声明分配给预处理器变量。

于 2012-06-15T20:19:13.700 回答