Alo*_*ave 50 c++ c++-faq include
stdio.h或者cstdio?为什么? Alo*_*ave 60
考虑以下程序:
#include<stdio.h>
int main()
{
printf("Hello World");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include<cstdio>
int main()
{
printf("Hello World");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
两者都按预期工作.那么哪种用法更合适? 答案是:都没有!惊讶吗?继续阅读.
出于兼容性原因,C++标准库提供了所有标准C头,而C++作为一种语言也提供了所有等效的头.作为惯例,
cxxxxx.C++标准在附录D(规范性)兼容性功能中提到了这一点:

§2提到了重要的区分点.适用于上述示例的此规则意味着:
让我们将此规则应用于我们的示例代码并衡量利弊:
示例1: 这将stdio.h中的所有符号带入全局命名空间.优点是您可以使用符号而无需任何限定,因为它们是在全局命名空间中导入的.缺点是你最终会用许多你可能永远不会使用的符号名称来污染全局命名空间.这可能会导致符号名称冲突.在C++中,始终将全局命名空间视为雷区,并尽可能避免使用它.
示例2: 这是一种非常糟糕的做法,因为无法保证实现将符号放在全局命名空间中,标准根本不要求这样做.我们只是依赖于一个特定编译器实现的行为.我们不能也不应该假设所有编译器都会这样做.严格来说,该程序未经标准批准,并且这种用法在所有实现中都不可移植.
正确的用法是使用cstdio和完全限定符号名称,或者使用using声明将它们放在范围内.这保证了我们使用的所有符号都存在于std命名空间中,并且我们不会污染全局命名空间.正确用法示例:
#include<cstdio>
using std::printf;
int main()
{
printf("Hello World");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意,该指令using namespace std;(尤其是在标头中)不是一个好的选项,您应该始终使用using声明.
请注意,我们认为stdio.h与cstdio在这里只是一个样本的使用情况,在实践中它适用于所有最cxxxx和xxxx.h头,除了少数喜欢<math.h>和<cmath>.
由于这篇文章有点旧,我想分享以下内容:
Using X.h // Compatible with C language standard
---------------
#include <X.h>
int main() {
// Invoke X's corresponding function
return 0;
}
Using X // Not compatible with C language standard
--------------
#include <X>
int main() {
// Invoke X's corresponding function
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C.5.1(C++ 17文档部分)对头文件的
修改[diff.mods.to.headers]
为了与C标准库兼容,C++标准库提供了D.5中枚举的C头,但在C++中不推荐使用它们.
有用于C标头中没有C++头
<stdatomic.h>,<stdnoreturn.h>和<threads.h>,也不是C标头本身的C部分++.C++的标头
<ccomplex>(D.4.1)和<ctgmath>(D.4.4),以及它们的相应的C头部<complex.h>和<tgmath.h>,不含有任何从C标准库的内容,而是仅包括从C++标准库其它标题.
D.5 C标准库头文件[depr.c.headers] 1.为了与C标准库兼容,C++标准库提供了表141中所示的C头.
无论C++ 11和C++ 17个标准规范注明证件使用<X.h>与C标准的兼容性遗体,但由于其使用被认为过时.
他们正在审查在C++ 20中使用C库头文件的"不引用".<X.h>以绿色突出显示.截至目前,C++ 11和C++ 17弃用被称为"弱推荐",并且用于保持" C标准库头(c.headers) " 的"调整" 如下所示:
"基本的C库头是必不可少的兼容性功能,不会很快到任何地方." (来自C++ 20评论文档)
D.5 C标准
库头文件[depr.c.headers]弱推荐:除上述之外,还从C++标准删除相应的C头,就像我们没有相应的
<stdatomic.h>,<stdnoreturn.h>或者<threads.h>,标头.如上所述,但有以下调整:20.5.5.2.1 C标准库头[c.headers]为了与C标准库兼容,C++标准库提供了表141中所示的C头.表141-C头
<assert.h> <inttypes.h> <signal.h> <stdio.h> <wchar.h>
<complex.h> <iso646.h> <stdalign.h> <stdlib.h> <wctype.h>
<ctype.h> <limits.h> <stdarg.h> <string.h>
<errno.h> <locale.h> <stdbool.h> <tgmath.h>
<fenv.h> <math.h> <stddef.h> <time.h>
<float.h> <setjmp.h> <stdint.h> <uchar.h>
Run Code Online (Sandbox Code Playgroud)
标题的
<complex.h>行为就像它只包含标题一样<complex>.标题的<tgmath.h>行为就像它只包含标题<complex>和<cmath>.
Bjarne Stroustrup建议通过尽可能减少不兼容性来最大化C和C++语言之间的互操作性.其他人则争辩说,因为它使事情复杂化.
所以,似乎<X.h>不会去任何地方.最终,你可以使用两者.就个人而言,我会决定使用哪一个让你的代码向后兼容C代码.
| 归档时间: |
|
| 查看次数: |
10064 次 |
| 最近记录: |