小编Dan*_*son的帖子

我该如何订购C++类的成员?

拥有所有私人成员,然后是所有受保护的成员,然后是所有公共成员?或者相反?或者是否应该有多个私有,受保护和公共标签,以便操作可以与构造函数分开等等?做出此决定时,我应该考虑哪些问题?

c++ code-formatting

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

我可以返回void函数吗?

我必须返回上一级递归.是下面的语法吗?

void f()
{
   // some code here
   //
   return;
}
Run Code Online (Sandbox Code Playgroud)

c++

45
推荐指数
3
解决办法
7万
查看次数

C宏问题 - (x)vs(-x)

我正在通过我的教授的测验答案,一个问题是:

像绝对值的宏这样的函数的正确实现是:

#define abs(x) ((x)<0 ? (-x) : (x))
#define abs(x) ((x)<0 ? -(x) : (x))
Run Code Online (Sandbox Code Playgroud)

为什么第二个与第一个相比是正确的?

为什么你必须使用所有().喜欢涉及的规则是什么?每个变量都需要一个()?谢谢.

c macros

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

如何将[[nodiscard]]属性应用于lambda?

我想阻止人们在不处理返回值的情况下调用lambda.

Clang 4.0拒绝我尝试过的所有内容,使用-std = c ++ 1z进行编译:

auto x = [&] [[nodiscard]] () { return 1; };
// error: nodiscard attribute cannot be applied to types
Run Code Online (Sandbox Code Playgroud)
auto x = [[nodiscard]] [&]() { return 1; };
// error: expected variable name or 'this' in lambda capture list
Run Code Online (Sandbox Code Playgroud)
auto x [[nodiscard]] = [&]() { return 1; };
// warning: nodiscard attribute only applies to functions, methods, enums, and classes
Run Code Online (Sandbox Code Playgroud)
[[nodiscard]] auto x = [&]() { return 1; };
// warning: nodiscard attribute …
Run Code Online (Sandbox Code Playgroud)

c++ lambda attributes language-lawyer c++17

14
推荐指数
1
解决办法
1252
查看次数

获取make以在出错时删除其他文件

我们最近讨论了在基于make的构建过程中处理依赖项的.d文件的方式.已经提出了一个问题,即当构建中断时,.d文件有时会被破坏.

我们使用.DELETE_ON_ERROR目标来确保如果构建中断或失败,则删除它正在生成的目标文件.但是我们也在编译时使用GCC生成.d文件,这些文件也需要删除.似乎没有一种直截了当的方式来说明这一点.

所以问题是,在出现错误的情况下,有没有一种方法可以同步删除我们的对象和我们的依赖文件?我们是否可以通过某种方式设置规则,以便它知道同时生成.d和.o文件,如果出现错误则需要删除?

或者,我们还能做些什么来解决损坏的.d文件的问题吗?沿着这些方向的一个建议是生成具有临时名称的.d文件,并且每个文件都有一个单独的后编译步骤,将其复制到正确的名称.

build-process makefile

7
推荐指数
1
解决办法
3350
查看次数

Eclipse很难看(来自恢复的vim用户)

所以,我终于冒险从vim使用eclipse ......但是我遇到了一些严重的问题,克服了令人难以置信的凌乱的界面和菜单系统.示例:右键单击主文本区域会生成一个包含~30个项目的子菜单...整个日食环境看起来很麻烦而且相当丑陋.

我已经煞费苦心地改变了字体和颜色,让我感到困扰的是,在整个设置窗口中都有设置.我希望有像emacs和vim这样的配色方案快速设置几十年了.通过stackoverflow我发现:

http://blog.codefront.net/2006/09/28/vibrant-ink-textmate-theme-for-eclipse/

但是,我想要更多的例子!像蛋糕或板岩之类的东西.

有没有人有秘密使eclipse成为一个更具有美学界面的更有用的工具?

eclipse vim user-interface colors

7
推荐指数
1
解决办法
3911
查看次数

有没有办法让两个读取原子?

我遇到了需要内存中两个值的原子总和的情况.我继承的代码是这样的:

int a = *MemoryLocationOne;
memory_fence();
int b = *MemoryLocationTwo;
return (a + b) == 0;
Run Code Online (Sandbox Code Playgroud)

a和b的单独读取都是原子的,并且代码中其他位置写入这两个内存位置的所有内容也是无锁原子的.然而,问题在于两个位置的值可以并且确实在两个读取之间改变.

那么如何使这个操作成为原子?我知道关于CAS的所有内容,但它往往只涉及使读取 - 修改 - 写入操作原子化,这不是我想要做的.

有没有办法做到这一点,或者是重构代码的最佳选择,这样我只需要检查一个值?

编辑:谢谢,我没有提到我想在第一次修订中无锁地执行此操作,但有些人在我的第二次修订后接受了它.我知道当他们说这样的话时没有人相信人,但我实际上不能使用锁.我必须使用原子来模拟一个互斥体,这比重构代码以跟踪一个值而不是两个值更有用.

目前我的调查方法涉及利用这些值是连续的这一事实,并使用64位读取原子地抓取它们,我确信这些目标平台上是原子的.如果有人有新想法,请捐款!谢谢.

language-agnostic multithreading atomic lock-free

6
推荐指数
1
解决办法
589
查看次数

为什么在offsetof()中减去空指针?

Linux的stddef.h定义offsetof()为:

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
Run Code Online (Sandbox Code Playgroud)

而维基百科上的文章offsetof()(http://en.wikipedia.org/wiki/Offsetof)将其定义为:

#define offsetof(st, m) \
    ((size_t) ( (char *)&((st *)(0))->m - (char *)0 ))
Run Code Online (Sandbox Code Playgroud)

为什么减去(char *)0维基百科版本?有什么情况会真正有所作为吗?

c offsetof pointer-arithmetic

6
推荐指数
1
解决办法
1079
查看次数

重载决策中的const指针

GCC将这两个函数声明视为等效:

void F(int* a) { }
void F(int* const a) { }
Run Code Online (Sandbox Code Playgroud)

test.cpp:在函数'void F(int*)'中:

test.cpp:235:错误:重新定义'void F(int*)'

test.cpp:234:错误:'void F(int*)'在此处定义

这有一定意义,因为在这种情况下调用者总是会忽略const ...它只会影响函数内部参数'a'的使用.

我想知道的是标准在哪里(如果有的话)说,为了重载解析的目的,丢弃用作函数参数的指针的限定符是特别好的.

(我真正的问题是我想弄清楚GCC在内部剥离这些毫无意义的限定符的地方,并且由于GCC的C++前端充斥着引用标准的注释,标准的相关部分可能帮助我找到正确的位置. )

c++ standards

5
推荐指数
1
解决办法
412
查看次数

可视化标记条件编译

我们有大量的C/C++代码,这些代码是为多个目标编译的,由#ifdefs分隔.其中一个目标与其他目标非常不同,了解您编辑的代码是否针对该目标进行编译通常很重要.不幸的是,#ifdefs可能非常分散,因此并不总是很明显为哪些目标编译了哪些代码.

Visual Studio的#ifdef突出显示有助于直观地识别为哪个目标编译哪些代码,但更改突出显示显然需要修改项目文件.

我有兴趣找到一种工具或方法,可以帮助编码人员快速识别哪些目标正在使用每行代码.即使它需要某种手动的源内注释,我认为它仍然有用.最好的情况是它是自动化的,不依赖于特定的编辑器或IDE,它可以配置为在某些条件下发出警告(例如"你修改了目标X上的一些代码,确保在该平台上测试你的代码!").

c++ cross-platform c-preprocessor

3
推荐指数
1
解决办法
351
查看次数