我知道在C和C++中,当将bool转换为int时,(int)true == 1和(int)false == 0.我想知道反向投射......
在下面的代码中,在使用Visual Studio 2013和KeilμVision5编译的.c文件中,以下所有断言都适用于我(bool)2 == true.
C和C++标准对于将非零,非一个整数转换为bool的说法是什么?是否指定了此行为?请加入引文.
#include <stdbool.h>
#include <assert.h>
void TestBoolCast(void)
{
int i0 = 0, i1 = 1, i2 = 2;
assert((bool)i0 == false);
assert((bool)i1 == true);
assert((bool)i2 == true);
assert(!!i0 == false);
assert(!!i1 == true);
assert(!!i2 == true);
}
Run Code Online (Sandbox Code Playgroud)
不是重复我可以假设(bool)true ==(int)1对于任何C++编译器?:
我有一个C++程序,我想在其中插入缺少的任何键的默认值std::map.我认为最简单的方法是使用std::map::operator[]()类似POSIX touch命令 - 也就是说,如果值已经存在则保持不变,但如果不存在则创建它.对于例如,
#include <map>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> keys = {0, 1};
map<int, int> m;
m[1] = 5;
m[2] = 12;
for (const int i : keys)
{
m[i]; // touch value
}
for (auto const & kv : m)
{
cout << kv.first << ", " << kv.second << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以确定编译器不会优化m[i];语句,因为我没有"做"任何事情吗?(没有明确指定,不读取.)
这是我上一个问题的后续,需要为 USB 外围设备编写驱动程序吗?
我正在使用 STM32 微控制器(裸机/无操作系统)设计 USB 外围设备。该设备偶尔会连接到 Windows PC,并在每个方向传输几 KB 的数据。将有一个定制的 PC 应用程序来控制数据传输,使用专有协议(即 USB 有效负载)。
PC 将始终是主机(启动器)——它将发送命令,设备将发出响应,在单个命令或响应中的任一方向最多有几百字节的数据。我想我会想使用 USB 批量传输模式。
据我了解,一种选择是我可以使用 USB 通信设备类 (CDC)。在设备端,我可以使用来自 ST 的示例代码用于 USB CDC,例如来自STM32Cube。在 PC 端,设备将显示为虚拟 COM 端口 (VCP)。然后在软件中,我基本上有一个原始的双向流,在此之上我必须定义我的消息格式、命令等。
我在思考这到底是什么以及如何使用它时遇到了麻烦。
WinUSB 与 USB 设备类的关系是什么?它似乎充当“通用”USB 类,但我找不到任何说明它的文档。
WinUSB 是否提供任何内置的消息分隔符?例如,WinUsb_WritePipe是否将缓冲区的内容作为原子单元发送到设备?或者我只是获得像 VCP/UART 这样的原始流?
如何在设备上实现 WinUSB?有可用的示例代码吗?(最好是 STM32。)
我正在使用STM32F072 探索板为自定义 USB 设备开发固件和 PC 测试应用程序。该设备包括 Microsoft Windows 兼容 ID (WCID),以便在 PC 上自动安装WinUSB 驱动程序。
该设备在其他 Windows 10 主机上被正确枚举,但在我的 Windows 10 开发 PC 上没有。我的开发 PC 之前曾尝试枚举具有相同 VID/PID 组合但具有不同描述符/元数据的设备。如果我将 PID 更改为其他数字(我的开发 PC 的新数字),它确实会正确枚举。
由于 Windows 从以前的枚举中缓存 USB 描述符等的方式,在固件开发过程中,每次我进行其他更改后,我都会增加固件中的设备产品 ID (PID),以确保 Windows 不会缓存来自描述符的先前迭代,并弄乱了本来可以工作的东西。
现在,我已将该设备作为 WinUSB 设备在 Windows 7、8 和 10 PC 上成功枚举,并且已建立通信。但是,当我将固件改回使用我开始使用的 VID/PID,然后将设备连接到我的开发 …
我正在设计一个 USB 外设,它偶尔会连接到 Windows PC,并在每个方向上传输几 KB 的数据。将有一个定制的 PC 应用程序使用专有协议(即 USB 有效负载)来控制数据传输。
我在下面的链接中看到 Microsoft 描述了如何为 USB 设备编写驱动程序。但我需要一个吗?
PC 应用程序是我们想要知道如何与设备通信的唯一应用程序,因此从应用程序共享的角度来看,不需要驱动程序。
我可以直接将自定义协议烘焙到应用程序中,让应用程序与设备对话“原始 USB”,并且无需单独的驱动程序吗?
从Merge、update 和 pull Git 分支上接受的答案中而不使用 checkouts,
如果分支 B 会导致非快进合并,则不能在不先检查 A 的情况下将分支 B 合并到分支 A 中。这是因为需要一个工作副本来解决任何潜在的冲突。
我推断并说您也git cherry-pick不能到达未结账的目的地是否正确?
USB 2.0 指定了4 种传输类型(在第 5.4 节传输类型中):
第 5.8 节说批量传输提供:
- 在带宽可用的基础上访问 USB
- 重试传输,在偶尔因总线错误而导致传输失败的情况下
- 保证数据传输,但不保证带宽或延迟
(强调我的。)
我没有看到类似的控制转移声明。他们也保证交货吗?如果没有,用户如何处理故障?
请提供引文以支持您的答案。
我正在为一些非托管 C++ 代码设置单元测试套件,但我有一些问题。
我使用Visual C++→ Test→将该项目添加到我的解决方案中Native Unit Test Project。
为了弄清楚这个测试框架中的事物是如何分组的,以及什么时候运行什么初始化,我用CppUnitTest.h 顶部的unittest1.cpp修改版本替换了源文件 ( )的内容USAGE EXAMPLE:
#include <CppUnitTest.h>
#include <string>
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
using std::string;
BEGIN_TEST_MODULE_ATTRIBUTE()
TEST_MODULE_ATTRIBUTE(L"Date", L"2010/6/12")
END_TEST_MODULE_ATTRIBUTE()
static string Indent("");
void openBlock()
{
Logger::WriteMessage((Indent + "{").c_str());
Indent += " ";
}
void closeBlock()
{
Indent.resize(Indent.size() >= 2 ? (Indent.size() - 2) : 0);
Logger::WriteMessage((Indent + "}").c_str());
}
TEST_MODULE_INITIALIZE(ModuleInitialize)
{
Logger::WriteMessage((Indent + "In Module Initialize").c_str());
openBlock();
}
TEST_MODULE_CLEANUP(ModuleCleanup)
{
closeBlock(); …Run Code Online (Sandbox Code Playgroud) c++ unit-testing visual-studio vs-unit-testing-framework visual-studio-2015
我在C中有一个接受uint8_t *参数的函数,该参数必须指向32位对齐的内存。是否可以在C或C ++或任何特定平台的宏中为参数添加一些修饰,以使编译器或链接器在未按要求对齐时在构建时抛出错误?
这里的想法是我想保护该功能,以防止其他用户(或我六个月内)不当使用该功能。我知道如何对齐我想传递给它的东西。我想确保没有人可以将未对齐的内容传递给它。
基于此答案,我认为我的问题的答案为“否”,无法在构建时强制执行此操作,但这似乎是一个有用的功能,因此我想检查一下。我的解决方法是assert((((size_t)ptr) % 4) == 0);函数,以便至少在调试时可以在运行时捕获它。
根据我的经验,结果,如果你投了错位未定义uint8_t*到uint32_t*许多嵌入式平台,所以我不想在“正确”的结果出来到底算。另外,这是在实时系统上使用的,因此放慢速度是不可接受的。
欢迎引用(如果有)。
我正在尝试创建包含文件系统模块的boost库的子集,因此我可以在项目存储库中包含该子集.我收到链接器错误,直到我手动复制.lib文件.我在Windows 7 64位上使用Visual Studio 2013.
我已经使用bcp成功提取了boost/algorithm/string.hpp及其依赖项,使用以下步骤:
从boost.org下载(v 1.57.0).
提取.
然
bootstrap.bat
Run Code Online (Sandbox Code Playgroud)
然后
b2.exe
Run Code Online (Sandbox Code Playgroud)
(我不知道b2是否对我的目的是必要的.)
通过打开命令提示符来构建bcp工具,我在其中提取了boost存档,然后运行
bjam tools\bcp
Run Code Online (Sandbox Code Playgroud)
作为描述在这里.
通过运行创建boost库子集
dist\bin\bcp.exe algorithm/string.hpp [outdir]
Run Code Online (Sandbox Code Playgroud)将结果复制到我的项目下的子文件夹中,将boost目录添加到C++ include搜索路径,并构建项目.
...
当我将filesystem或filesystem.hpp添加到上面的命令时(即使我在我自己的源文件中使用--scan选项),并将结果复制到我的项目文件夹,然后尝试包含"boost/filesystem.hpp",我明白了
LINK : fatal error LNK1104: cannot open file 'libboost_system-vc120-mt-gd-1_57.lib'
Run Code Online (Sandbox Code Playgroud)
在*.libbcp的输出中找不到文件.为了得到它来建立,我不得不手动复制libboost_system-*.lib和libboost_filesystem-*.libLIB \文件从舞台\我的项目(并添加包含他们项目属性目录- >配置属性- >链接器- >常规- >附加库目录).
这是bcp没有复制所需内容的预期行为吗?还是我错过了一步?或者它是一个bcp bug?