C++:在 mac osx 上使用 std::cout 和 gcc
Posted
技术标签:
【中文标题】C++:在 mac osx 上使用 std::cout 和 gcc【英文标题】:C++: Using std::cout with gcc on a mac osx 【发布时间】:2010-02-12 06:22:26 【问题描述】:我是 C++ 编程新手,我尝试在 Mac 上使用终端中的 gcc 进行第一次练习。
很遗憾,由于与 iostream 相关的问题,我无法编译。用一个简单的程序:
#include <iostream>
int main()
std::cout << "hello world";
std::cout << endl;
return 0;
它给了我错误:
error: ‘endl’ was not declared in this scope
删除 cout
Undefined symbols:
"___gxx_personality_v0", referenced from:
___gxx_personality_v0$non_lazy_ptr in cceBlyS2.o
"std::ios_base::Init::~Init()", referenced from:
___tcf_0 in cceBlyS2.o
"std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
_main in cceBlyS2.o
"std::ios_base::Init::Init()", referenced from:
__static_initialization_and_destruction_0(int, int)in cceBlyS2.o
"std::cout", referenced from:
__ZSt4cout$non_lazy_ptr in cceBlyS2.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
很明显,iostream 标头没有正确链接。我尝试了 "" 和 "iostream.h" 都没有成功。
有没有人有任何可以帮助我的提示? 谢谢!
【问题讨论】:
【参考方案1】:您需要使用std::endl;
-- 整个标准库位于std
命名空间中。看起来您在命令行上使用了gcc
而不是g++
。后者自动执行正确链接 C++ 所需的步骤。
【讨论】:
感谢您!现在一切正常。感谢您帮助像我这样的新手! 我刚开始学习 C++,我只能说,哇,我不知道 GCC 和 G++ 之间有区别(呃),救了我的命。谢谢大佬。【参考方案2】:endl;
属于 std
命名空间
您的 2 个选项如下:
1) 声明你的命名空间,例如
#include <iostream>
using namespace std;
int main()
cout << "hello world";
cout << endl;
return 0;
或使用std::endl;
例如
std::cout << "hello world";
std::cout << std::endl;
return 0;
看看哪一个适合你。我推荐 1)(检查我没有做 std::cout
,因为我已经声明了我的命名空间)因为它有助于减少每次输入 std::
。
【讨论】:
【参考方案3】:您只需要使用std::endl;
。或者,更好的是,使用方便的using
指令:
#include <iostream>
using namespace std;
int main()
cout << "hello world";
cout << endl;
return 0;
【讨论】:
对于您需要访问的给定x
而言,将命名空间设置为 using namespace std::x;
与一举将整个命名空间纳入范围相比,这与 using namespace std::x;
的目的不符。
@Chris:我不同意。虽然我肯定会避免在 头文件 中使用 using namespace std;
之类的东西,但我认为在源文件中非常好,尤其是像这样的简单文件。除非绝对必要,否则我认为没有理由到处使用std::
污染源文件。我还希望永远不要重复使用 STL 中已经使用过的名称。引入整个命名空间会让我及早发现这样的错误。
@e.James:有一个小问题:你不知道std
命名空间中有什么——它可以而且确实在不同的实现之间有所不同。您可以让某些东西在任意长度内正常工作,然后停止使用不同的(a 版本)编译器。诚然,在 this 的情况下,您定义的 only 名称是 main
,没有太多可能出错的地方——但是当/如果你再做除此之外,这是一个完全不同的故事。
@Jerry Coffin:我不得不承认我从来没有经历过这样的事情。不同的实现在std
命名空间中真的有不同的公共名称吗?
@e.James:是的,当然。仅举一个例子,如果您想要 POSIX 兼容性,您必须定义大量不在 C 或 C++ 标准中的名称(一些在标准头文件中)。以上是关于C++:在 mac osx 上使用 std::cout 和 gcc的主要内容,如果未能解决你的问题,请参考以下文章