为什么 c++ 可以包含 <stdio.h> 并调用 printf 方法,即 c(platform:ubuntu 14.04 编译器:gcc 4.8.4)

Why could c++ include <stdio.h> and invoke printf method which is c(platform:ubuntu 14.04 compiler:gcc 4.8.4)

本文关键字:platform ubuntu 编译器 gcc 方法 包含 lt c++ stdio printf 为什么      更新时间:2023-10-16

c++编译器可以编译这样的代码,并且执行正确

#include <stdio.h>
int main() {
    printf("test...n");
    return 0;
}

我认为printf.c将被编译为printf。使用c编译器,我刚刚检查了stdio.h,没有extern " c "关键字,那么c++链接器如何在printf中链接printf。哪个是用c编译器编译的?(顺便说一下,我的平台是ubuntu 14.04,编译器是gcc 4.8.4)

printf是c++标准库的一部分。

包含在c++源代码中的<stdio.h>头文件,属于c++标准库,不一定与C编译器包含的内容相同。

c++实现如何利用相应的C实现(如果有的话)是一个实现细节。

当c++最初被创造出来的时候,它实际上是C的超集。也就是说,你可以在c++环境中编写完美的C代码,只需忽略c++添加的所有特性。因为现在大多数C编译器都是c++编译器,你可以在其中编写C代码,所以你可以使用printf

其次,没有为stdio生成目标代码,因为它已经是一个库,所以您将自己的。o代码链接到已经编译的stdio库代码,这些代码将位于您的编译器目录中的某个地方。

在不知道你在使用什么实现的情况下,没有人能给你一个明确的答案。

干杯!- Alf给出了一种可能性,即c++程序中包含的stdio.h可能与C程序中包含的stdio.h不同。另一种可能性是它是相同的标题,并且一个extern "C"块,您只是看不到它。例如,我使用gcc,我的/usr/include/stdio.h包含一个__BEGIN_DECLS宏,在编译为c++时扩展为extern "C" {。参见"我需要外部文件吗?"块包括标准的C头?

您可能在stdio.h中看不到显式的extern "C",但它确实存在。它只是在隐藏。

例如,在Linux上,在stdio.h中我们看到这样:

#include <features.h>
__BEGIN_DECLS

<features.h>中,您将发现以下内容:

# ifndef _SYS_CDEFS_H
#  include <sys/cdefs.h>
# endif

<sys/cdefs.h>你终于看到:

#ifdef  __cplusplus
# define __BEGIN_DECLS  extern "C" {
# define __END_DECLS    }
#else
# define __BEGIN_DECLS
# define __END_DECLS
#endif

因此,通过一个相当迂回的路径,Linux头文件有一个__BEGIN_DECLS/__END_DECLS包装器,当由c++编译器编译时,最终将整个内容包装在extern "C"内。