C++中仅引入<string>头文件即可调用C库函数是否为标准预期行为?
这是个挺有意思的问题,我刚转C写代码的时候也踩过类似的“隐式依赖”坑,先给你把核心结论说在前头:**这绝对不是C标准规定的预期行为**,只是编译器标准库实现里的常见“副作用”而已。
首先得明确C++标准的底线:每个标准头文件的职责是严格划分的,std::string类以及相关的字符串操作工具,标准里从来没要求它必须把C库的那些头文件(比如对应<stdio.h>的
那为啥你的代码用g编译能跑通?这是因为不同编译器的标准库实现(比如GCC用的libstdc、Clang用的libc++),在实现size_t,就得引入<stddef.h>;处理某些字符操作可能又间接用到了
但这里必须敲个警钟:这种“碰巧能用”的情况绝对不能当成规范来用!比如你换个编译器(比如从GCC换成MSVC),或者换个标准库版本,说不定memset,结果换MSVC编译直接报“memset未定义”,坑了我好半天。
至于你疑惑为啥能调用C库的函数:这是因为C++的C兼容头文件(比如printf既可以直接用,也可以写成std::printf。当
最后给你个实打实的建议:写C++代码一定要养成显式包含所有用到的头文件的习惯,哪怕当前编译器允许你偷懒。比如你的代码里用到printf,就必须加#include <cstdio>;用到atoi加#include <cstdlib>;用到int32_t加#include <cstdint>;用到size_t可以加#include <cstddef>。这样不管你换什么编译器、什么环境,代码都能稳定编译。
内容来源于stack exchange

