我已经告诉别人,编写using namespace std;代码是错误的,我应该用std::cout和std::cin直接代替.
为什么被using namespace std;认为是不好的做法?是低效还是冒着声明模糊变量(与名称std空间中的函数具有相同名称的变量)的风险?它会影响性能吗?
我来自Java背景,使用包,而不是命名空间.我习惯于将一起工作的类放在一起形成一个完整的对象,然后再从该包中重用它们.但现在我在使用C++.
你如何在C++中使用命名空间?您是为整个应用程序创建单个名称空间,还是为主要组件创建名称空间?如果是这样,如何从其他命名空间中的类创建对象?
关于std命名空间使用'using'似乎有不同的看法.
有人说使用' using namespace std',其他人说不要,而是先加上与' std::' 一起使用的std函数,而其他人则说使用这样的东西:
using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::vector;
Run Code Online (Sandbox Code Playgroud)
对于要使用的所有std函数.
各自的优点和缺点是什么?
包括什么意义
ios_base::sync_with_stdio(false);
cin.tie(NULL);
Run Code Online (Sandbox Code Playgroud)
在C++程序中?
在我的测试中,它加快了执行时间,但有一个测试用例,我应该担心包含这个吗?
这两个陈述总是必须在一起,或者第一个是否足够,即忽略cin.tie(NULL)?
此外,如果其值已设置为false?允许同时使用C和C++命令吗?
https://www.codechef.com/viewsolution/7316085
上面的代码运行正常,直到我scanf/printf在C++程序中使用值为true.在这种情况下,它给出了分段错误.可能的解释是什么?
我正在努力在单元测试下获取一些遗留代码,有时感知现有程序行为的唯一方法是从控制台输出.
我在网上看到很多关于如何将stdout重定向到C++中的另一个文件的例子,但有没有办法可以将它重定向到内存中的流,这样我的测试就不必依赖磁盘了?
我希望将遗留代码发送到stdout的任何内容转换为std :: string,这样我就可以轻松地查找输出.
编辑
遗留代码是如此糟糕,以至于用户混合使用cout << ..和printf.这是我到目前为止:
void TestSuite::setUp(void)
{
oldStdoutBuf = std::cout.rdbuf();
std::cout.rdbuf(consoleOutput.rdbuf());
}
void TestSuite::tearDown(void)
{
std::cout.rdbuf(oldStdoutBuf);
}
Run Code Online (Sandbox Code Playgroud)
问题是,这并没有用printf捕捉输出.我想要两件兼得的东西.有任何想法吗?
输出到调试窗口似乎相当繁琐.cout如果我正在编写非控制台信息,我在哪里可以找到输出?
喜欢:
double i = a / b;
cout << b << endl;//I want to check out whether b is zero. It seems the output cannot be found anywhere.
Run Code Online (Sandbox Code Playgroud) 使用c-style i/o进行编程时,我有时会使用freopen()重新打开stdin进行测试,这样我就不必重复输入输入.我想知道是否有相当于c ++的i/o流.此外,我知道我可以使用管道在命令行/终端/任何炎症上重定向它但我想知道是否有办法在我的代码中执行它(因为你可以看到,我不是很了解CL/T/W).
我只是用c ++编程,突然之间所有的"cout"和"cin"都是错误和"不明确".包括系统.
我不知道为什么会这样.一切都很好,我正在编写相同的程序大约2个小时,当它刚刚发生时.
编辑
我仍然可以毫无错误地运行程序,但它们在文本上显示为错误,红色涂鸦线.发生了什么?
我正在使用Visual Studio 2013 IDE,无论它是什么.
#include <iostream>
#include <ctime>
#include <string>
#include <Windows.h>
#include <cstdlib>
#include <stdlib.h>
using namespace std;
int main()
{
struct Gun
{
string name;
int damage;
int cost;
bool purchased;
bool equipped;
} M4A1, FAMAS;
//WEAPONS INFO
M4A1.cost = 50;
M4A1.damage = 5;
M4A1.purchased = false;
M4A1.equipped = false;
FAMAS.cost = 300;
FAMAS.damage = 10;
FAMAS.purchased = false;
FAMAS.equipped = false;
//WEAPONS INFO
//-----PLAYER(BEGIN)-----
struct Player
{
int health;
string name;
int …Run Code Online (Sandbox Code Playgroud) 如果我在log某处定义名称空间并使其在全局范围内可访问,则会与double log(double)标准cmath标题冲突.实际上,大多数编译器似乎也同意它 - 大多数版本的SunCC,MSVC,GCC - 但GCC 4.1.2没有.
不幸的是,似乎没有办法解决歧义,因为using声明对于命名空间标识符是不合法的.你知道我可以log::Log在全局命名空间中编写任何方式cmath吗?
谢谢.
编辑:有人会知道C++ 03标准对此有何看法?我原以为范围运算符足以消除log下面代码示例中的使用歧义.
#include <cmath>
namespace foo
{
namespace log
{
struct Log { };
} // namespace log
} // namespace foo
using namespace foo;
int main()
{
log::Log x;
return 0;
}
// g++ (GCC) 4.1.2 20070115 (SUSE Linux)
// log.cpp: In function `int main()':
// log.cpp:20: error: reference to `log' is ambiguous
// /usr/include/bits/mathcalls.h:110: …Run Code Online (Sandbox Code Playgroud) 我希望cin从字符串中读取输入.
有没有办法让它这样做?
像这样的东西:
const char * s = "123 ab";
cin.readFrom(s);//<---- I want something like this
int i;
cin>>i;
cout<<i; //123
Run Code Online (Sandbox Code Playgroud) c++ ×10
namespaces ×4
c ×2
c++-faq ×1
io ×1
iostream ×1
legacy-code ×1
std ×1
stdout ×1
unit-testing ×1