Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;重新定义变量、全局名称空间和I don';我不知道为什么_C++_Macos_C++11_Compilation_Clang - Fatal编程技术网

C++ C++;重新定义变量、全局名称空间和I don';我不知道为什么

C++ C++;重新定义变量、全局名称空间和I don';我不知道为什么,c++,macos,c++11,compilation,clang,C++,Macos,C++11,Compilation,Clang,所以我觉得我做了一些非常愚蠢的事情,我就是想不出来。以下程序给我带来了很多痛苦: #include <iostream> int time = 0; int main(int argc, char **argv) { std::cout << "hi" << std::endl; return 0; } 我就是不知道怎么了。如果我将-nostinc++添加到命令行args to clang中,然后删除iostream include,但保留t

所以我觉得我做了一些非常愚蠢的事情,我就是想不出来。以下程序给我带来了很多痛苦:

#include <iostream>
int time = 0;
int main(int argc, char **argv) {
    std::cout << "hi" << std::endl;
    return 0;
}
我就是不知道怎么了。如果我将
-nostinc++
添加到命令行args to clang中,然后删除iostream include,但保留time变量,则一切正常。我猜这意味着iostream包含了时间。但是我很困惑,它是否应该包含ctime而不是time.h,后者将所有内容都封装在std名称空间中

我尝试过删除xcode并重新安装

更新:

Mats的评论让我更加窥探。因此,将-H传递给clang++将打印出头树。结果证明pthread.h实际上包含time.h。但ctime实际上也包括时间。这似乎符合标准,因为:“在C++标准库中,声明(除了在C中定义为宏的名称)在命名空间范围内(3.3.6)。未指定这些名称是否首先在全局命名空间范围内声明,然后通过显式使用声明将其注入命名空间std中。

time()
是标准C中的一个函数,这意味着它位于命名空间之外,因此“old”C代码可以用C++编译器编译,而不需要大量的<代码>,使用命名空间STD < /C> >遍历。 当您包含
时,标题
time.h
显然包含在内,这就是为什么您会得到对该标题的引用

不要使用该名称,或者添加
名称空间MyName{int time;}
然后在引用变量时使用
MyName::time

< P> >我不知道确切的位置,但我相信C++标准的规定:“当包含例如“代码> <代码> > >代码> >代码>时,“现有的标准库函数可能存在或不存在于代码< STD::/Calp>命名空间之外。 例如,在my linux box上的g++4.9.2标题中:

....
#pragma GCC system_header

#include <bits/c++config.h>
#include <time.h>

#ifndef _GLIBCXX_CTIME
#define _GLIBCXX_CTIME 1

 ...     
namespace std
{
  ...
  using ::time;
  ...
} // namespace
。。。。
#pragma GCC系统头
#包括
#包括
#ifndef_GLIBCXX_CTIME
#定义_GLIBCXX_CTIME 1
...     
名称空间标准
{
...
使用时间;
...
}//名称空间

libcxx中的一个看起来几乎相同。

好吧,如果
包括
,那么它是不一致的。包括
也是一样。是的,我最终做了名称空间的事情。哦,伙计,你说的ctime实际上包括时间是对的。h。我仍然不明白为什么,我认为cname头是name.h的精确副本如果C代码包含时间。h,C++编译器不应该是问题,但是如果C++代码想要使用cTime,它应该得到它的后。看起来像pth.h是IoSt流的罪魁祸首。你可以把-h传递给编译器,它会打印出包含TeeOHE的这个可爱的摘录:然而,在C++标准库中,声明(除了在C中定义为宏的名称)位于命名空间STD的命名空间范围内(3.3.6)。未指定这些名称是否首先在全局命名空间范围内声明,然后通过显式使用声明“注入”命名空间STD:(DeDePcRead)另一种阅读方式是荒谬的,它意味着,例如,没有C++头可以包括<代码> >代码> <代码> NulpPrTrtt< /C>或<代码> SiZeSt。
....
#pragma GCC system_header

#include <bits/c++config.h>
#include <time.h>

#ifndef _GLIBCXX_CTIME
#define _GLIBCXX_CTIME 1

 ...     
namespace std
{
  ...
  using ::time;
  ...
} // namespace