小编Bar*_*uch的帖子

c ++标题中的"using namespace"

在我们所有的C++课程,所有的老师总是把using namespace std;在之后#include在它们的S .h文件.从那时起,我觉得这很危险,因为在另一个程序中包含该标题我会将命名空间导入到我的程序中,可能没有意识到,打算或想要它(标题包含可以非常深入嵌套).

所以我的问题是双重的:我是对的,using namespace不应该在头文件中使用,和/或是否有某种方法来撤消它,例如:

//header.h
using namespace std {
.
.
.
}
Run Code Online (Sandbox Code Playgroud)

还有一个问题是:标题文件是否应该是#include相应.cpp文件所需的所有标题,只有那些标题定义所需的标题,并让.cpp文件#include为其余标题,或者没有,并声明它需要的所有内容extern
问题背后的原因与上面相同:在包含.h文件时我不想要惊喜.

另外,如果我是对的,这是一个常见的错误吗?我的意思是在现实世界的编程和"真正的"项目中.

谢谢.

c++ namespaces header-files

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

有什么理由不使用全局 lambda 表达式?

我们有一个函数,它使用了自身内部的非捕获 lambda,例如:

void foo() {
  auto bar = [](int a, int b){ return a + b; }

  // code using bar(x,y) a bunch of times
}
Run Code Online (Sandbox Code Playgroud)

现在 lambda 实现的功能在其他地方变得需要,所以我将把 lambda 提升foo()到全局/命名空间范围之外。我可以将其保留为 lambda,使其成为复制粘贴选项,或者将其更改为适当的函数:

auto bar = [](int a, int b){ return a + b; } // option 1
int bar(int a, int b){ return a + b; } // option 2

void foo() {
  // code using bar(x,y) a bunch of times
}
Run Code Online (Sandbox Code Playgroud)

将其更改为适当的函数是微不足道的,但这让我想知道是否有理由将其保留为 lambda?有什么理由不只是到处使用 lambda 而不是“常规”全局函数?

c++ lambda

93
推荐指数
6
解决办法
8008
查看次数

C++中的struct padding

如果我有一个structC++,有没有办法安全地读/写一个跨平台/编译器兼容的文件?

因为如果我理解正确,每个编译器"填充"基于目标平台不同.

c++ struct

51
推荐指数
3
解决办法
5万
查看次数

函数指针需要一个&符号

在C/C++中,如果我有以下功能:

void foo();
void bar(void (*funcPtr)());
Run Code Online (Sandbox Code Playgroud)

这两个电话之间有区别吗:

bar(foo);
bar(&foo);
Run Code Online (Sandbox Code Playgroud)

c c++ function-pointers

38
推荐指数
2
解决办法
5071
查看次数

std :: is_invocable为false但std :: invoke有效

以下程序的输出似乎自相矛盾:

#include <type_traits>
#include <iostream>
#include <functional>

void foo(int&){ std::cout << "called\n"; }

int main() {
    int a;
    foo(a);
    std::cout << std::is_invocable_v<decltype(foo), decltype(a)> << std::endl;
    std::invoke(foo, a);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

called
0
called
Run Code Online (Sandbox Code Playgroud)

在我看来,调用一个不可调用的函数?这里发生了什么?

c++ c++17

35
推荐指数
1
解决办法
2793
查看次数

C中的函数名是什么类型的?

我总是理解在C中,func并且&func是等价的.我假设它们都应该是类型指针,在我的Win64系统上是8个字节.但是,我刚试过这个:

#include <stdio.h>

int func(int x, int y)
{
    printf("hello\n");
}

int main()
{
    printf("%d, %d\n", sizeof(&func), sizeof(func));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

而期望获得输出8, 8却很惊讶8, 1.

为什么是这样?到底 什么类型func?它似乎是类型char或某种等价物.
这里发生了什么?

gcc -std=c99如果它有所作为,我编译了这个.

c function

33
推荐指数
3
解决办法
1866
查看次数

SimpleNamespace和空类定义有什么区别?

以下似乎无论如何都有效.使用的优点(除了好的repr)有什么用types.SimpleNamespace?或者它是一回事吗?

>>> import types
>>> class Cls():
...     pass
... 
>>> foo = types.SimpleNamespace() # or foo = Cls()
>>> foo.bar = 42
>>> foo.bar
42
>>> del foo.bar
>>> foo.bar
AttributeError: 'types.SimpleNamespace' object has no attribute 'bar'
Run Code Online (Sandbox Code Playgroud)

python python-3.x

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

struct alignment C/C++

在c/c ++中(我假设它们在这方面是相同的),如果我有以下内容:

struct S {
  T a;
  .
  .
  .
} s;
Run Code Online (Sandbox Code Playgroud)

以下是否保证是真的?

(void*)&s == (void*)&s.a;
Run Code Online (Sandbox Code Playgroud)

或者换句话说,是否有任何保证第一个成员之前没有填充?

c c++ memory-layout

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

应用程序内存泄漏是否会导致操作系统内存泄漏?

当我们说一个程序泄漏内存,说没有删除在C++中,它真的泄漏?我的意思是,当程序结束时,是否仍然将内存分配给某些非运行程序并且无法使用,或者操作系统是否知道每个程序请求的内存,并在程序结束时释放它?如果我多次运行该程序,我会耗尽内存吗?

operating-system memory-leaks

27
推荐指数
5
解决办法
4980
查看次数

可移植代码 - 每个字符的位数

我知道C/C++标准只能保证每个字符最少 8位,理论上9/16/42 /其他任何东西都是可能的,因此所有关于编写可移植代码的网站都会警告不要假设8bpc.我的问题是"非便携式"这是真的吗?

让我解释.在我看来,有三类系统:

  1. 计算机 - 我的意思是台式机,笔记本电脑,服务器等,运行Mac/Linux/Windows/Unix/*nix/posix /等等(我知道这个列表并不严格,但你明白了).听到任何这样的系统char完全是 8位,我会感到非常惊讶.(如果我错了,请纠正我)
  2. 带操作系统的设备 - 包括智能手机和此类嵌入式系统.虽然我发现这样一个系统的char位数比8位多,我不会感到非常惊讶,但我还没有听说过一个这样的系统(如果我不知道的话,请再次通知我)
  3. 裸机设备 - 录像机,微波炉,旧手机等.在这个领域我没有丝毫的经验,所以任何事情都可能发生在这里.但是,我真的需要我的代码在我的Windows桌面和微波炉之间跨平台吗?我可能有两个共同的代码吗?

底线:是否有共同的(大于%0.001)平台(在类别1和2以上),其中char不是 8位?我的上述猜测是真的吗?

c c++ bits char

27
推荐指数
2
解决办法
6086
查看次数