C++变量的重新定义,全局命名空间被污染,我不知道为什么
C++ redefinition of variable, global namespace polluted and I don't know why
所以我觉得我做了一些非常愚蠢的事情,我就是想不通。以下程序给我带来了很多痛苦:
#include <iostream>
int time = 0;
int main(int argc, char **argv) {
std::cout << "hi" << std::endl;
return 0;
}
我的编译字符串是:clang++ -std=c++1y --verbose -stdlib=libc++ main.cpp -o main
。重新定义错误为/usr/include/time.h:116:8: note: previous definition is here
,--verbose
显示为包含路径顺序:
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix
"/Library/Developer/CommandLineTools/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.10.0 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name main.cpp -mrelocation-model pic -pic-level 2 -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 241.9 -v -resource-dir /Library/Developer/CommandLineTools/usr/bin/../lib/clang/6.0 -stdlib=libc++ -std=c++1y -fdeprecated-macro -fdebug-compilation-dir /Users/aliak/dev/atom/sim -ferror-limit 19 -fmessage-length 0 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.10.0 -fencode-extended-block-signature -fcxx-exceptions -fexceptions -fdiagnostics-show-option -vectorize-slp -o /var/folders/r_/pmd7rtcd4h35dqsf496nyzsh0000gn/T/main-d500bd.o -x c++ /Users/aliak/dev/atom/sim/main.cpp
clang -cc1 version 6.0 based upon LLVM 3.5svn default target x86_64-apple-darwin14.1.0
ignoring nonexistent directory "/usr/include/c++/v1"
#include "..." search starts here:
#include <...> search starts here:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1
/usr/local/include
/Library/Developer/CommandLineTools/usr/bin/../lib/clang/6.0/include
/Library/Developer/CommandLineTools/usr/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
我就是搞不清楚出了什么问题。如果我在命令行-nostdinc++
中添加args以clang,然后删除iostream include,但保留时间var,那就没问题了。我想这意味着iostream包括time.h。但我很困惑,它不应该包括ctime而不是time.h吗?ctime会将所有内容封装在std命名空间中?
我已经尝试删除xcode并重新安装。
更新:
Mats的评论让我多窥探了一点。因此,将-H传递给clang++将打印出标题树。事实证明pthread.h实际上包括time.h。但ctime实际上也包括time.h,这似乎符合标准,因为:"然而,在C++标准库中,声明(除了在C中定义为宏的名称)都在命名空间范围内(3.3.6)命名空间std的。未指定这些名称是否首先在全局命名空间范围内声明,然后通过显式使用声明注入命名空间std 当您包含 如果要引用变量,请不要使用该名称,或者添加 [我不知道确切的位置,但我相信C++标准指出,"当你包括例如 例如,在我的linux盒子上的g++4.9.2标题中: libcxx中的那个看起来几乎一模一样。time()
是标准C中的一个函数,这意味着它位于命名空间之外,因此可以使用C++编译器编译"旧"C代码,而无需到处抛出大量using namespace std
。<iostream>
时,标头time.h
显然也包含在内,这就是为什么您会得到对它的引用。namespace MyName { int time; };
,然后使用MyName::time
。<ctime>
时,现有的标准库函数可能存在也可能不存在于std::
命名空间之外——<ctime>
的实际实现几乎肯定在某个地方包括常规的<time.h>
。"....
#pragma GCC system_header
#include <bits/c++config.h>
#include <time.h>
#ifndef _GLIBCXX_CTIME
#define _GLIBCXX_CTIME 1
...
namespace std
{
...
using ::time;
...
} // namespace
- 在命名空间中使用全局命名空间中的函数
- 类与命名空间的全局实例
- 将好友从模板导出到全局命名空间
- Catalina C++:使用<cmath>标头产生错误:全局命名空间中没有名为 'signbit' 的成员
- 将以"_[a-z0-9]"开头和"using"的标识符导入全局命名空间是否定义良
- C++从 std::async 函数读取命名空间中的全局变量标志
- 为什么不允许在全局命名空间处阻止范围?
- 如何在命名空间中声明外部全局,然后定义它?
- 运算符<<依赖于参数的查找不在全局命名空间中查找
- 我可以停止 GCC 将标准库名称包含在全局命名空间中吗?
- 在C 中将全局函数包括在命名空间中
- 为什么在全局范围以及命名空间std中定义了size_t
- 如何处理警告 C4177:#pragma 'float_control' 只能在全局范围或命名空间范围内使用
- "uintmax_t":不是"全局命名空间"的成员
- C++项目中的全局命名空间
- 使用 "::member" 引用全局命名空间有什么用吗?
- 在全局命名空间中重载不依赖于用户定义类型的标准定义类型的运算符是否格式正确?
- 命名空间中的全局变量会导致"undefined reference to"
- 在C 中重新解析命名空间内的全局类型
- 命名空间全局变量丢失值 (C++)