stdio.h
或者cstdio
?为什么? 所以这是我一直想知道但却从未确定过的事情.所以这完全是好奇心问题,而不是真正的问题.
据我所知,当你#include <cstdlib>
在std::
命名空间中声明所有事情(当然除了宏)之外.我见过的每个实现都是通过执行以下操作来实现的:
#include <stdlib.h>
namespace std {
using ::abort;
// etc....
}
Run Code Online (Sandbox Code Playgroud)
这当然会影响全局命名空间和std
.这种行为有保证吗?或者实现是否可能将这些内容放入std
全局命名空间中而不是放在全局命名空间中?我能想到的唯一办法做到这一点是有你的libstdc ++实现每一个C函数本身将它们放置在std
直接而不只是包括现有的libc头文件(因为没有机制来移除命名空间的东西).这当然是很多努力,几乎没有任何好处.
我的问题的实质是,以下程序是否严格符合并保证有效?
#include <cstdio>
int main() {
::printf("hello world\n");
}
Run Code Online (Sandbox Code Playgroud)
编辑:我发现的最接近的是这个(17.4.1.2p4):
除了如条款18至27所指出的,每一个报头的CNAME的内容应是相同于相应的头name.h的,如在ISO指定/ IEC 9899:1990编程语言C(第7章),或ISO/IEC :1990编程语言-C修正案1:C完整性,(第7条),酌情包括在内.但是,在C++标准库中,声明和定义(在C中定义为宏的名称除外)都在命名空间std的命名空间范围(3.3.5)内.
说实话,我可以解释任何一种方式."每头CNAME的内容应当相同相应的头name.h的,符合ISO/IEC 9899:1990编程语言C"告诉我,他们可以在全局命名空间是必需的,但"在但是,C++标准库,声明和定义(在C中定义为宏的名称除外)都在命名空间std的命名空间范围(3.3.5)内.说他们在std(但没有指明他们所在的任何其他范围).
C++编程语言:特别版在第431页说明......
For every header < X.h > defining part of the C standard library in the global namespace and also in namespace std, there is a header < cX > defining the same names in the std namespace only.
但是,当我在<cX>样式中使用C头时,我不需要限定命名空间.例如...
#include <cmath>
void f() {
double var = sqrt( 17 );
}
Run Code Online (Sandbox Code Playgroud)
这将编译好.虽然本书说使用<cX>标头仅定义std命名空间中的名称,但您可以使用这些名称而不限定命名空间.我在这里错过了什么?
PS使用GNU.GCC编译器
这是一个由两部分组成的问题:
如果我#include <cmath>
在标题中, 1 - 使用,比如说,和
之间有什么区别?
2 - 为什么我得到的汇编代码与另一个的汇编代码如此不同?(产生的指令明显减少)std::log10()
log10()
std::log10()
谢谢!
#include <cmath>
float using_std(float i) {
return std::log10(i);
}
float not_using_std(float i) {
return log10(i);
}
Run Code Online (Sandbox Code Playgroud)
组装(来自godbolt)
using_std(float):
jmp log10f
not_using_std(float):
sub rsp, 8
cvtss2sd xmm0, xmm0
call log10
add rsp, 8
cvtsd2ss xmm0, xmm0
ret
Run Code Online (Sandbox Code Playgroud)
我知道这些指令不是“实际”汇编,它们可能隐藏了更细粒度的指令,我只是想知道我看到的差异是否与代码的实际性能相关。
好吧,这是有道理的,如果我改为#include <math.h>
,它们是相同的:
using_std(float):
jmp log10f
not_using_std(float):
jmp log10f
Run Code Online (Sandbox Code Playgroud)