首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同时包含<cstdio>和<stdio.h>的顺序正确吗?

同时包含<cstdio>和<stdio.h>的顺序正确吗?
EN

Stack Overflow用户
提问于 2009-06-21 10:42:32
回答 6查看 3.8K关注 0票数 4

我需要使用特定于系统的函数,例如ftello() (在stdio.h中按照POSIX标准定义)。我还需要使用标准的C++特性,例如std::sprintf() (在cstdio中定义,按照ISO C++标准)。

只包含<cstdio>并不能保证定义非标准C++的东西,所以我想我必须同时包含这两个。我很久以前就读到过(举个例子),对于gcc来说,包含文件的顺序可能有问题。

那么,同时包含<cstdio><stdio.h>的正确顺序是什么?我正在寻找一个尽可能跨平台的解决方案(至少是对gcc、suncc、英特尔C++/linux和mingw)。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-07-18 13:30:50

好的,经过进一步的研究,我最终得出了一个结论,首先包含C++头,然后再包含C头是正确的做法。例如,考虑以下C++0x报头(来自gcc):

/usr/include/c++/4.3/tr1_impl/cstdint:

代码语言:javascript
运行
复制
// ...
#define __STDC_LIMIT_MACROS
#define __STDC_CONSTANT_MACROS
#include_next <stdint.h>
// ...

它所做的就是定义两个C99宏,然后才包含C99 stdint.h头文件。原因是在C99中,stdint.h的一些特性是可选的,并且只有在定义了这些宏时才可用。但是,在C++0x中,所有stdint.h特性都是必需的。现在,如果我先包含C99 stdint.h,然后再包含cstdint.h,由于stdint.h中的头保护,我将无法获得强制的C++0x特性。有人可能会争辩说这是编译器供应商的错,但这是不正确的。H是一个系统捆绑的报头(在本例中来自glibc ),它是一个C99报头,对C++0x (毕竟它可以是一个旧系统)或gcc一无所知。编译器并不能真正修复所有的系统头文件(在这种情况下,总是在C++模式下启用这些特性),但是它必须在这些系统上提供C++0x支持,所以供应商使用这种变通方法。

票数 2
EN

Stack Overflow用户

发布于 2009-06-21 10:50:35

对于系统头文件,包含的顺序通常不应该是错误的来源。

对于其他头文件,请查看similar question here at SO

票数 2
EN

Stack Overflow用户

发布于 2009-06-22 00:47:51

我不知道有什么真正的规则,但一般来说,我会在较高级别的库之前包含较低级别的系统库。

因此,在这种情况下,stdio.h是一个C头文件,(在我的想象中)更接近机器,而<cstdio>是更高级别的C++标准库,我认为它更抽象。

我自己倾向于在cstdio之前包含stdio.h,但我不知道有什么确切的理由来支持这一基本原理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1023638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档