小编πάν*_*ῥεῖ的帖子

为什么省略花括号被认为是一种不好的做法?

为什么每个人都告诉我编写这样的代码是一种不好的做法?

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)

c c# c++ java coding-style

177
推荐指数
29
解决办法
5万
查看次数

C++枚举类可以有方法吗?

我有一个带有两个值的枚举类,我想创建一个接收值并返回另一个值的方法.我还想保持类型安全(这就是我使用枚举类而不是枚举的原因).

http://www.cplusplus.com/doc/tutorial/other_data_types/没有提及方法的任何内容但是,我的印象是任何类型的类都可以有方法.

c++ methods enums

117
推荐指数
5
解决办法
7万
查看次数

为什么C在使用三元运算符时不允许连接字符串?

以下代码编译没有问题:

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)

这是什么原因?

c string concatenation

95
推荐指数
7
解决办法
9257
查看次数

为什么std :: getline()在格式化提取后会跳过输入?

我有以下代码提示用户输入他们的名字和状态:

#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)

我发现该名称已被成功提取,但不是州.这是输入和结果输出:

Input:

"John"
"New Hampshire"

Output:

"Your name is John and you live in "
Run Code Online (Sandbox Code Playgroud)

为什么输出中省略了状态名称?我给出了正确的输入,但代码忽略了它.为什么会这样?

c++ iostream input c++-faq istream

92
推荐指数
2
解决办法
2万
查看次数

C++函数参数安全性

在一个采用相同类型的多个参数的函数中,我们如何保证调用者不会搞乱排序?

例如

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)

c++ c++14

58
推荐指数
7
解决办法
3692
查看次数

为什么operator << std :: ostream和char之间的函数是非成员函数?

当我运行以下程序时

#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::ostreamchar

std::ostream& operator<<(std::ostream& out, char c);
Run Code Online (Sandbox Code Playgroud)

否则,std::cout << a将解决std::ostream::operator<<(int).

我的问题是为什么声明/定义为非成员函数?是否存在阻止其成为会员功能的已知问题?

c++ ostream c++11

36
推荐指数
2
解决办法
957
查看次数

将C++类的定义放入头文件是一个好习惯吗?

当我们用Java,Vala或C#设计类时,我们将定义和声明放在同一个源文件中.但在C++中,传统上优先将两个或多个文件中的定义和声明分开.

如果我只使用头文件并将所有内容放入其中,如Java,会发生什么?是否存在性能损失?

c++ declaration definition header-files

31
推荐指数
2
解决办法
2万
查看次数

如何测试stringstream operator >>是否解析了错误类型并跳过它

我有兴趣讨论用于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并解析下一个数字?

c++ stringstream

30
推荐指数
2
解决办法
2万
查看次数

std :: type_info :: name()的实际目的是什么?

今天我的一位同事来问我标题中提到的问题.
他目前正在尝试减少代码库的二进制文件占用空间,这也用于小型目标(如Cortex M3等).显然他们决定在RTTI打开的情况下进行编译(实际上是GCC),以支持正确的异常处理.

好吧,他的主要抱怨是为什么std::type_info::name()实际上需要RTTI的支持,并问,如果我知道一种方法来抑制生成支持这一点所需的字符串文字,或者至少缩短它们.

的std :: TYPE_INFO ::名

const char* name() const; 返回包含类型名称的实现定义的以null结尾的字符串.不给出任何保证,特别是返回的字符串对于几种类型可以是相同的,并且在相同程序的调用之间改变.

A, - 但是特定于编译器 - ,例如dynamic_cast<>运算符的实现不会使用此信息,而是类似于用于类型确定的哈希标记(类似于catch()具有异常处理的块).
我认为后者明确表达了当前的标准定义

  1. std::type_info::hash_code
  2. std::type_index

我不得不同意,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)的未使用的运行时函数

c++ gcc c++11

25
推荐指数
2
解决办法
1364
查看次数

我将如何编写虚拟机

我对编程虚拟机很感兴趣,没有像虚拟机或vmware那样华丽,但可以模仿一个简单的架构,无论是cisc还是risc,比如Zilog,SPARC,MIPS或80686架构模型.

我想通过这样做,制作一个相同类型的模拟器会相对简单,我只是对使用它来获得经验感兴趣(作为我的第一个C项目,我宁愿在C中做这个比在还要别的吗).

vm-implementation

23
推荐指数
5
解决办法
2万
查看次数