新安装 VSCode。我安装的唯一扩展是 Microsoft C/C++ Intellisense 插件。版本0.24.1
我正在使用一个代码库,其中包含一些带有#define X foo宏的头文件。在.cpp文件中,它用红色下划线并表示“标识符 X 未定义”。但是,如果我按 ctrl+click/F12,它会将我带到.h定义了宏的文件。
这是我现在唯一的扩展,所以我不认为这是插件竞争的问题。具有多个定义的宏似乎很常见。即我们有
chipset1/include/registers.h和
chipset2/include/registers.h
这可能两者#define REG1 0xF00或相似。"${workspaceFolder}/chipset1/include"不过我的档案里只有这些.vscode/c_cpp_properties.json。所以我不知道为什么它还要搜索chipset2定义。也许这就是导致问题的原因,并且错误消息具有误导性,实际上应该说“找到多个定义”之类的内容吗?仍然不确定为什么会发生这种行为。
我在物理引擎中有一个循环,它检测如下碰撞:
// now check for collisions
// we only allow 1 collision per 2 partcles per frame so the
// one with the lower index will always "collide" first
for (size_t j = 0; j < m_particles.size(); j++) {
for (size_t k = j + 1; k < m_particles.size(); k++) {
m_particles[j].collide(m_particles[k]);
}
}
Run Code Online (Sandbox Code Playgroud)
我进行了更改,在内部对粒子使用双缓冲区。(顺便说一句;这样做是为了我可以检测到错误并返回 1 个时间步来纠正)。双缓冲区是用两个指针实现的,我在这个循环之后交换了这两个指针。所以现在我们有:
// now check for collisions
// we only allow 1 collision per 2 partcles per frame so the
// one with the lower …Run Code Online (Sandbox Code Playgroud) 看起来当我创建一个std::initializer_list<B*>where class Bis 派生class A并将其传递给接受 a 的函数时std::initializer_list<A*>,编译器会感到困惑。但是,如果我创建一个std::initializer_list<B*>带有大括号初始值设定项的就地(我假设它是一个临时的std::initializer_list),它就可以很好地转换它。
具体来说,它似乎无法转换std::initializer_list<B*>为std::initializer_list<A*>,即使某些转换明显存在,如此处的一个工作函数调用所证明的那样。
这种行为的解释是什么?
#include <initializer_list>
#include <iostream>
class A {
public:
A() {}
};
class B : public A {
public:
B() {}
};
using namespace std;
void do_nothing(std::initializer_list<A*> l) {
}
int main() {
B* b1;
B* b2;
std::initializer_list<B*> blist = {b1, b2};
//error, note: candidate function not viable: no known conversion from
//'initializer_list<B *>' to 'initializer_list<A *>' …Run Code Online (Sandbox Code Playgroud) 我正在和Wireshark一起调试我正在研究的一些IoT家庭自动化项目.我想我会更多地了解HTTP和TCP/IP的实际工作方式.我发现的大多数解释都将HTTP描述为"在TCP/IP之上",但我更具体地询问实际发送的是什么.
这是我捕获的客户端/服务器交互的示例:
Client: [SYN]
Server: [SYN, ACK]
Client: [ACK]
Run Code Online (Sandbox Code Playgroud)
如果我了解到目前为止,他们现在已经成功建立了TCP连接.然而,下一次捕获向我展示
Client: POST /whatever
Server: 200 OK
Run Code Online (Sandbox Code Playgroud)
好的,现在我迷路了.检查捕获显示我在一帧中有一个以太网,IP,TCP和HTTP层.它实际上就像客户端在TCP数据包结束后将这些额外的字节喷射到路由器后添加一堆文本一样简单吗?据推测,然后解析TCP/IP并相应地转发它?这是我困惑的根源.通过"骑在上面"是指(在物理意义上)HTTP只是在TCP数据包之后在同一帧中发送的一系列字节?在这种情况下,HTTP被认为是TCP/IP的有效载荷吗?
当然要完成
Server: [FIN, ACK]
Client: [ACK]
Client: [FIN, ACK]
Server: [ACK]
//In this case the server terminates the connection.
Run Code Online (Sandbox Code Playgroud)
编辑:下面的一位评论者问了一个问题,这让我感觉好像我不是很清楚我在问什么.
想象一下,我可以站在我的客户端和服务器之间(或者可能更准确地站在我的客户端和路由器之间以及路由器和服务器之间).当必须通过物理介质(校验和,纠错码等)物理地发送原始数据时,忽略这些考虑因素,实际流量与时间相关的是什么?我是否会看到以太网层的字节后跟ip层,tcp,http等的字节?
以下将不起作用:
std::array<int, 3> arr = {1, 2, 3};
int **ptr = &(arr.data());
Run Code Online (Sandbox Code Playgroud)
因为我会尝试获取右值的地址。我已经解决了它:
std::array<int, 3> arr = {1, 2, 3};
int *ptr = arr.data();
int **ptr2 = &ptr;
Run Code Online (Sandbox Code Playgroud)
这似乎工作得很好。
我知道您不能获取右值的地址,但为什么在这里如此对待它?是因为将创建一个临时文件arr.data(),然后将其分配给ptr我,我会尝试获取该临时文件的地址吗?
c++ ×4
assembly ×1
c++14 ×1
casting ×1
gcc ×1
http ×1
networking ×1
optimization ×1
rvalue ×1
tcp ×1