相关疑难解决方法(0)

112
推荐指数
13
解决办法
46万
查看次数

我应该在C++程序中包含<xxxx.h>还是<cxxxx>?

  • 我应该在C++程序中包含什么,stdio.h或者cstdio?为什么?
  • 为什么两个头文件提供相同的功能?
  • 标准对此有何看法?
  • 我应该怎么做包括其他这样的标题,我应该遵循一个基本规则吗?

c++ c++-faq include

50
推荐指数
2
解决办法
1万
查看次数

在<c ____>标题中声明的C函数是否保证在全局名称空间和std中?

所以这是我一直想知道但却从未确定过的事情.所以这完全是好奇心问题,而不是真正的问题.

据我所知,当你#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 c++ namespaces

16
推荐指数
1
解决办法
707
查看次数

C++中C库的范围 - <Xh> vs <cX>

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编译器

c++ gcc gnu

5
推荐指数
2
解决办法
1181
查看次数

调用 cmath 函数时应该使用 std:: 吗?

这是一个由两部分组成的问题:

如果我#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)

c++ assembly std cmath

4
推荐指数
1
解决办法
201
查看次数

标签 统计

c++ ×5

assembly ×1

c ×1

c++-faq ×1

cmath ×1

gcc ×1

gnu ×1

include ×1

math ×1

namespaces ×1

std ×1