这段 C 代码是什么意思?

4
在一些Bison代码中,以下这行是什么意思?
#define YY_DECL extern "C" int yylex();

我知道 #define 命令,但我不太理解整个命令的含义。


1
这个 ':' 应该在行末吗? - Niall C.
我已经将 : 替换为 ;,但更常规的做法是不使用分号,因此当您编写 YYDECL; 时,在预处理代码中不会出现多余的分号。 - Jonathan Leffler
3个回答

6
这意味着YY_DECL将被扩展为:
extern "C" int yylex();

这实际上是C++,而不是C;当您使用C++编译器编译此文件时,它会声明函数 yylex 必须使用“C链接”进行编译,以便C函数可以无障碍地调用它。
如果您不使用C ++编程,则这与您无关,但是您可能会在库的C头文件中遇到类似的声明,因为这些库试图与C++兼容。 C和C++可以在单个程序中混合使用,但是需要此类声明才能使函数良好地协同工作。
这个#define周围可能有一个#ifdef __cplusplus;这是一种特殊的宏,用于指示由C ++编译器编译。

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

定义一个宏 YY_DECL,用于在C++程序中声明具有“C”链接的函数yylex,该函数不带参数且返回一个int


2

#define - 预处理器指令,声明一个新的变量给预处理器。但你已经知道了。

YY_DECL - 变量的名称。

extern "C" - 告诉编译器以下代码是纯C语言。C和C++之间有很多区别,一般情况下不能混用C和C++代码。如果在声明中包含这个,它允许你在C++中使用C语言。编辑:实际上代码不需要是纯C,但会被链接为纯C。但最常见的用法是让C代码与C++兼容。感谢@larsmans的更正。

int yylex() - 声明一个名为yylex的函数,其参数数量未定义,返回类型为int

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


4
"extern "C""并不代表"纯C语言",它仅声明了C语言的链接方式。对于C++编译器而言,函数体内可以使用任意C++特性。 - Fred Foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接