为什么 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)
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"
内。
- 在Ubuntu 16.04上安装Cilk时出现问题
- 如何在Ubuntu中使用cmake设置qt4
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 无法将 GLFW 库与 Ubuntu 18.04 上的头文件链接
- 无法在Ubuntu上将共享库与Eclipse链接
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- 无法安装 R 包 "nloptr"(Ubuntu 16.04 上的 R3.6.2) - C++编译器问题
- 使用 ubuntu 终端在 c++ 上运行线程类的问题
- 如何在 Ubuntu 上安装 OpenCV for C/C++
- 如何解决"no Qt platform plugin could be initialized"问题?
- 估计 Ubuntu C++内存使用情况
- 在 Ubuntu 中创建自动安装程序
- 分段 Linux Ubuntu 中的 g++ 错误,但在 Windows 中的 g++/MingW 中,在 C++ 中打
- OpenGL 在 VMWare Fusion 版本 10.1.3 上安装的虚拟机 (Ubuntu 16.04) 上崩溃
- 在 ubuntu 上安装 node js pulsar 客户端
- 在 Ubuntu 18.04 上编译 GLSL 着色器时"不支持 GLSL 3.30"?
- 这是 ubuntu 16.04 中的 gdb 错误吗?
- 生成文件:6:目标'all'的配方在 Ubuntu-16.04 上失败
- LinuxdeployQT 今天如何创建 Appimage,自 ubuntu 16.04 发布以来,它可以在每个 Lin
- 为什么 c++ 可以包含 <stdio.h> 并调用 printf 方法,即 c(platform:ubuntu 14.04 编译器:gcc 4.8.4)