为什么每个人都告诉我编写这样的代码是一种不好的做法?
if (foo)
Bar();
//or
for(int i = 0 i < count; i++)
Bar(i);
Run Code Online (Sandbox Code Playgroud)
省略花括号的最大理由是它有时可以是它们的两倍.例如,下面是一些为C#中的标签绘制发光效果的代码.
using (Brush br = new SolidBrush(Color.FromArgb(15, GlowColor)))
{
for (int x = 0; x <= GlowAmount; x++)
{
for (int y = 0; y <= GlowAmount; y++)
{
g.DrawString(Text, this.Font, br, new Point(IconOffset + x, y));
}
}
}
//versus
using (Brush br = new SolidBrush(Color.FromArgb(15, GlowColor)))
for (int x = 0; x <= GlowAmount; x++)
for (int y = 0; y <= GlowAmount; y++) …
Run Code Online (Sandbox Code Playgroud) 我有一个带有两个值的枚举类,我想创建一个接收值并返回另一个值的方法.我还想保持类型安全(这就是我使用枚举类而不是枚举的原因).
http://www.cplusplus.com/doc/tutorial/other_data_types/没有提及方法的任何内容但是,我的印象是任何类型的类都可以有方法.
以下代码编译没有问题:
int main() {
printf("Hi" "Bye");
}
Run Code Online (Sandbox Code Playgroud)
但是,这不编译:
int main() {
int test = 0;
printf("Hi" (test ? "Bye" : "Goodbye"));
}
Run Code Online (Sandbox Code Playgroud)
这是什么原因?
我有以下代码提示用户输入他们的名字和状态:
#include <iostream>
#include <string>
int main()
{
std::string name;
std::string state;
if (std::cin >> name && std::getline(std::cin, state))
{
std::cout << "Your name is " << name << " and you live in " << state;
}
}
Run Code Online (Sandbox Code Playgroud)
我发现该名称已被成功提取,但不是州.这是输入和结果输出:
Run Code Online (Sandbox Code Playgroud)Input: "John" "New Hampshire" Output: "Your name is John and you live in "
为什么输出中省略了状态名称?我给出了正确的输入,但代码忽略了它.为什么会这样?
在一个采用相同类型的多个参数的函数中,我们如何保证调用者不会搞乱排序?
例如
void allocate_things(int num_buffers, int pages_per_buffer, int default_value ...
Run Code Online (Sandbox Code Playgroud)
然后
// uhmm.. lets see which was which uhh..
allocate_things(40,22,80,...
Run Code Online (Sandbox Code Playgroud) 当我运行以下程序时
#include <iostream>
int main()
{
char c = 'a';
std::cout << c << std::endl;
std::cout.operator<<(c) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到了输出
a
97
Run Code Online (Sandbox Code Playgroud)
在http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt进一步挖掘,我注意到std::ostream::operator<<()
没有char
作为参数类型的重载.函数调用std::cout.operator<<(a)
被解析为std::ostream::operator<<(int)
,这解释了输出.
我假设和operator<<
之间的函数在其他地方声明为:std::ostream
char
std::ostream& operator<<(std::ostream& out, char c);
Run Code Online (Sandbox Code Playgroud)
否则,std::cout << a
将解决std::ostream::operator<<(int)
.
我的问题是为什么声明/定义为非成员函数?是否存在阻止其成为会员功能的已知问题?
当我们用Java,Vala或C#设计类时,我们将定义和声明放在同一个源文件中.但在C++中,传统上优先将两个或多个文件中的定义和声明分开.
如果我只使用头文件并将所有内容放入其中,如Java,会发生什么?是否存在性能损失?
我有兴趣讨论用于stringstream
解析具有多种类型的行的方法.我将从查看以下行开始:
"2.832 1.3067 nana 1.678"
Run Code Online (Sandbox Code Playgroud)
现在让我们假设我有一个有多个strings
和的长行doubles
.解决这个问题的显而易见的方法是将字符串标记化,然后检查转换每个字符串.我有兴趣跳过第二步,stringstream
直接使用只找到数字.
我认为解决这个问题的好方法是读取字符串并检查是否failbit
已设置,如果我尝试将字符串解析为double,它将会是这样.
说我有以下代码:
string a("2.832 1.3067 nana 1.678");
stringstream parser;
parser.str(a);
for (int i = 0; i < 4; ++i)
{
double b;
parser >> b;
if (parser.fail())
{
std::cout << "Failed!" << std::endl;
parser.clear();
}
std::cout << b << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它将打印出以下内容:
2.832
1.3067
Failed!
0
Failed!
0
Run Code Online (Sandbox Code Playgroud)
我没有惊讶它没有解析一个字符串,但内部发生了什么,以至于它无法清除它failbit
并解析下一个数字?
今天我的一位同事来问我标题中提到的问题.
他目前正在尝试减少代码库的二进制文件占用空间,这也用于小型目标(如Cortex M3等).显然他们决定在RTTI打开的情况下进行编译(实际上是GCC),以支持正确的异常处理.
好吧,他的主要抱怨是为什么std::type_info::name()
实际上需要RTTI的支持,并问,如果我知道一种方法来抑制生成支持这一点所需的字符串文字,或者至少缩短它们.
的std :: TYPE_INFO ::名
const char* name() const;
返回包含类型名称的实现定义的以null结尾的字符串.不给出任何保证,特别是返回的字符串对于几种类型可以是相同的,并且在相同程序的调用之间改变.
A, - 但是特定于编译器 - ,例如dynamic_cast<>
运算符的实现不会使用此信息,而是类似于用于类型确定的哈希标记(类似于catch()
具有异常处理的块).
我认为后者明确表达了当前的标准定义
我不得不同意,std::type_info::name()
除了用于调试(日志记录)之外,我还没有真正看到使用点.我不是100%确定异常处理只能在没有RTTI的情况下使用当前版本的GCC(我认为它们使用的是4.9.1),所以我犹豫是否建议只需关闭RTTI.
也是dynamic_casts<>
在他们的代码库中使用的情况,但对于这些,我只是建议不要使用它,支持static_cast
(他们没有像插件那样的东西,或者除了断言之外还需要运行时类型检测).
std::type_info::name()
除了日志记录?有没有人有一个想法,如何克服(解决)这些无用的字符串文字的生成(假设它们永远不会被使用)?
RTTI是否真的(仍然)需要支持GCC的异常处理?
(这个部分现在很好地解决了@ Sehe的答案,并且我已经接受了它.另外一个子问题仍然留给std::type_info
代码中使用的任何异常的剩余生成实例.我们很确定,这些文字永远不会随处使用)
相关的一点:删除膨胀可执行(GCC)的未使用的运行时函数
我对编程虚拟机很感兴趣,没有像虚拟机或vmware那样华丽,但可以模仿一个简单的架构,无论是cisc还是risc,比如Zilog,SPARC,MIPS或80686架构模型.
我想通过这样做,制作一个相同类型的模拟器会相对简单,我只是对使用它来获得经验感兴趣(作为我的第一个C项目,我宁愿在C中做这个比在还要别的吗).
c++ ×8
c ×2
c++11 ×2
c# ×1
c++-faq ×1
c++14 ×1
coding-style ×1
declaration ×1
definition ×1
enums ×1
gcc ×1
header-files ×1
input ×1
iostream ×1
istream ×1
java ×1
methods ×1
ostream ×1
string ×1
stringstream ×1