相关疑难解决方法(0)

为什么在C++头文件中使用#ifndef和#define?

我一直在头文件的开头看到这样的代码:

#ifndef HEADERFILE_H
#define HEADERFILE_H
Run Code Online (Sandbox Code Playgroud)

并在文件的最后是

#endif
Run Code Online (Sandbox Code Playgroud)

这样做的目的是什么?

c c++ c-preprocessor

458
推荐指数
4
解决办法
39万
查看次数

我在哪里可以找到当前的C或C++标准文档?

对于许多问题,答案似乎可以在"标准"中找到.但是,我们在哪里找到它?最好是在线.

谷歌搜索有时会觉得徒劳,尤其是对于C标准,因为他们在编程论坛的大量讨论中被淹没.

要开始这个,因为这些是我现在正在搜索的,那里有很好的在线资源:

  • C89
  • C99
  • C11
  • C++ 98
  • C++ 03
  • C++ 11
  • C++ 14

c c++ standards c++-faq

394
推荐指数
8
解决办法
12万
查看次数

计算字符串中的字符出现次数

我如何计算"_"字符串中的数字"bla_bla_blabla_bla"

c++ string pattern-matching

187
推荐指数
7
解决办法
26万
查看次数

为什么在C++类中使用成员变量的前缀

许多C++代码使用语法约定来标记成员变量.常见的例子包括

  • 公共成员的m_ memberName(根本使用公共成员)
  • _ memberName为私人成员或所有成员

其他人尝试在使用成员变量时强制使用this-> member.

根据我的经验,大多数较大的代码库都无法一致地应用这些规则.

在其他语言中,这些惯例远没有那么普遍.我只偶尔在Java或C#代码中看到它.我想我从未在Ruby或Python代码中看到它.因此,似乎有一种趋势,即更多现代语言不对成员变量使用特殊标记.

这个约定今天在C++中是否仍然有用,或者它只是一个时代错误.特别是因为它在库之间使用不一致.没有其他语言显示没有成员前缀可以做到吗?

c++ coding-style naming-conventions

141
推荐指数
12
解决办法
10万
查看次数

命名约定 - 在C++和C#变量中使用下划线

_var在类字段中看到变量名是很常见的.下划线是什么意思?是否有所有这些特殊命名约定的参考?

c# c++ naming-conventions

131
推荐指数
5
解决办法
15万
查看次数

在C++中方便地声明编译时字符串

能够在C++编译时创建和操作字符串有几个有用的应用程序.尽管可以在C++中创建编译时字符串,但是该过程非常麻烦,因为字符串需要声明为可变字符序列,例如

using str = sequence<'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!'>;
Run Code Online (Sandbox Code Playgroud)

诸如字符串连接,子字符串提取等许多操作可以很容易地实现为对字符序列的操作.是否可以更方便地声明编译时字符串?如果没有,是否有一个提案可以方便地声明编译时字符串?

为什么现有方法失败

理想情况下,我们希望能够如下声明编译时字符串:

// Approach 1
using str1 = sequence<"Hello, world!">;
Run Code Online (Sandbox Code Playgroud)

或者,使用用户定义的文字,

// Approach 2
constexpr auto str2 = "Hello, world!"_s;
Run Code Online (Sandbox Code Playgroud)

哪里decltype(str2)有一个constexpr构造函数.方法1的混乱版本可以实现,利用您可以执行以下操作的事实:

template <unsigned Size, const char Array[Size]>
struct foo;
Run Code Online (Sandbox Code Playgroud)

但是,数组需要有外部链接,所以要使方法1起作用,我们必须编写如下内容:

/* Implementation of array to sequence goes here. */

constexpr const char str[] = "Hello, world!";

int main()
{
    using s = string<13, str>;
    return 0; …
Run Code Online (Sandbox Code Playgroud)

c++ string metaprogramming user-defined-literals c++11

131
推荐指数
8
解决办法
6万
查看次数

如何转发在命名空间std中声明模板类?

#ifndef __TEST__
#define __TEST__

namespace std
{
    template<typename T>
    class list;
}

template<typename T>
void Pop(std::list<T> * l)
{
    while(!l->empty())
        l->pop();
}

#endif
Run Code Online (Sandbox Code Playgroud)

并在我的主要使用该功能.我收到错误.当然,我知道有更多的模板参数std::list(我认为是分配器).但是,这是不重要的.我是否必须知道模板类的完整模板声明才能转发声明它?

编辑:我之前没有使用指针 - 这是一个参考.我会用指针试一试.

c++ templates g++

129
推荐指数
3
解决办法
13万
查看次数

为什么将未使用的返回值转换为void?

int fn();

void whatever()
{
    (void) fn();
}
Run Code Online (Sandbox Code Playgroud)

是否有任何理由将未使用的返回值转换为无效,或者我是否认为这完全是浪费时间?

跟进:

那看起来相当全面.我认为这比评论未使用的返回值更好,因为自我记录代码比评论更好.就个人而言,我会关掉这些警告,因为这是不必要的噪音.

如果一个虫子逃脱,我会吃掉我的话......

c c++ void

105
推荐指数
7
解决办法
4万
查看次数

为什么人们在C++中使用__(双下划线)这么多

我正在浏览一些开源的C++代码,并注意到代码中使用的分数很多,主要是在变量名称的开头.

return __CYGWIN__;
Run Code Online (Sandbox Code Playgroud)

只是想知道是否有这样的原因,或者只是一些人的代码风格?我认为我很难读.

c++ double-underscore

86
推荐指数
6
解决办法
6万
查看次数

C++ getters/setters编码风格

我已经在C#中编程了一段时间,现在我想要提高我的C++技能.

上课:

class Foo
{
    const std::string& name_;
    ...
};
Run Code Online (Sandbox Code Playgroud)

什么是最好的方法(我只想允许对name_字段的读访问):

  • 使用getter方法: inline const std::string& name() const { return name_; }
  • 让这个领域公开,因为它是一个常数

谢谢.

c++ coding-style getter-setter

65
推荐指数
5
解决办法
17万
查看次数