小编Adr*_*thy的帖子

为什么Windows 10会在我的程序中启动额外的线程?

使用Visual Studio 2015,在一个新的空C++项目中,为Console应用程序构建以下内容:

int main() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在返回时设置断点并在调试器中启动程序.在Windows 7上,从断点开始,该程序只有一个线程.但在Windows 10上,它有五个(!)线程:主线程和四个"工作线程"等待同步对象.

谁在启动线程池(或者我如何找到)?

c++ windows multithreading threadpool

32
推荐指数
1
解决办法
6205
查看次数

"if"条件下的变量赋值

我最近失去了一些时间来弄清楚我的代码中的错误是由一个错字引起的:

if(a=b)
Run Code Online (Sandbox Code Playgroud)

代替:

if(a==b)
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何特殊情况你想要在if语句中为变量赋值,或者如果没有,为什么编译器不会发出警告或错误?

c++ if-statement

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

将int自己的地址分配给其值

以下代码是未定义的行为,实现是由标准定义还是定义的?我找不到任何关于将整数分配给自己的地址的参考.

volatile int x = (int)&x;
Run Code Online (Sandbox Code Playgroud)

此代码转换为:

lea         eax,[ebp-4]  
mov         dword ptr [ebp-4],eax 
Run Code Online (Sandbox Code Playgroud)

c c++

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

逐字节读取二进制istream

我试图使用ifstream逐字节读取二进制文件.我之前使用像get()之类的istream方法一次读取二进制文件的整个块而没有问题.但是我目前的任务有助于逐字节地进行,并依靠io系统中的缓冲来提高效率.问题是我似乎比我应该更快地到达文件的末尾几个字节.所以我写了以下测试程序:

#include <iostream>
#include <fstream>

int main() {
    typedef unsigned char uint8;
    std::ifstream source("test.dat", std::ios_base::binary);
    while (source) {
        std::ios::pos_type before = source.tellg();
        uint8 x;
        source >> x;
        std::ios::pos_type after = source.tellg();
        std::cout << before << ' ' << static_cast<int>(x) << ' '
                  << after << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这会转储test.dat的内容,每行一个字节,显示前后的文件位置.

果然,如果我的文件碰巧有两个字节的序列0x0D-0x0A(对应于回车和换行),则跳过这些字节.

  • 我以二进制模式打开了流.不应该阻止它解释行分隔符吗?
  • 提取操作员总是使用文本模式吗?
  • 从二进制istream中逐字节读取的正确方法是什么?

Windows上的MSVC++ 2008.

c++ binaryfiles istream

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

如何使用clang格式文件提供Visual Studio Clang-Format插件?

所以我下载,安装并插入了clang格式化插件的路径.我也测试了它,它适用于谷歌(Mozilla等)开箱即用的格式化选项,但我无法使用我的.clang格式文件.(我把我的文件放到与我的源文件相同的文件夹中,将其编码改为UTF-8,也尝试将其放入clang安装文件夹,将文件添加到项目中,将其内容写入其中'{key:value}'但格式化不会发生).那么如何将格式文件提供给chrome格式的扩展名呢?

我的文件内容:

 { BasedOnStyle: "LLVM",    IndentWidth: 4 }
Run Code Online (Sandbox Code Playgroud)

我的文件名:nm.clang-format

c++ clang visual-studio clang-format

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

如何使用Win32/GDI加载PNG图像(如果可能,没有GDI +)?

是否可以使用Win32 GDI函数将PNG从文件加载到HBITMAP中?如果没有,没有使用外部库(如libpng),最轻的解决方案是什么?

c++ winapi png gdi image

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

std :: copy是否处理重叠范围?

将数据从一个范围复制到另一个范围时,如果源范围和目标范围之间存在部分重叠,则必须小心.如果目标范围的开头与源范围的尾部重叠,则普通顺序副本将使数据混乱.C运行时库具有memmovememcpy处理这种重叠的问题.

我假设这样的std::copy工作memcpy,因为它不考虑源和目标区域之间的重叠.如果您尝试在std::vectorwith中"向下"移动对象std::copy,则会破坏数据.是否有STL算法类似于memmove处理这样的情况?或者我应该使用反向迭代器自己滚动?

c++ algorithm stl copy

21
推荐指数
2
解决办法
4422
查看次数

(WiX)每台机器安装的程序文件快捷方式

按照此处示例,我添加了一个启动我的应用程序的ProgramMenuFolder的快捷方式.(我的代码实际上更简单,因为我不需要额外的文件夹.)

<DirectoryRef Id='ProgramMenuFolder'>
  <Component Id='cmpStartMenuShortcut'
             Guid='MY GUID HERE'>
    <Shortcut Id='StartMenuShortcut'
              Name='$(var.ProductName)'
              Icon='MainIcon.ico'
              Description='$(var.ProductName)'
              Target='[ClientDir]myapp.exe'
              WorkingDirectory='ClientDir'/>
    <RegistryValue Action='write' Type='integer' Root='HKCU'
                   Key='Software\Company\Product Name'
                   Name='installed' Value='1' KeyPath='yes'/>
  </Component>
</DirectoryRef>
Run Code Online (Sandbox Code Playgroud)

由于我的安装是每台机器(ALLUSERS = 1,Package/@ InstallPrivileges ='advanced'和@ InstallScope ='perMachine'),因此ProgramMenuFolder是机器上所有用户的文件夹.

我的问题与注册表值有关.我的理解是,只需为包含快捷方式的组件提供KeyPath即可.该示例使用HKCU,这是一个每用户位置.

将每用户值用作每台计算机组件的KeyPath不是一个错误吗?

如果一台机器有两个管理员,而管理员#1安装该产品,而管理员#2尝试修复,那么Windows安装程序将看不到该注册表值并认为该快捷方式丢失并且它将安装一个副本,对吧?

所以我尝试将RegistryValue/@ Root更改为HKLM,但随后WiX抱怨:

错误LGHT0204:ICE38:组件cmpStartMenuShortcut安装到用户配置文件.它的[原文如此] KeyPath注册表项必须属于HKCU.

错误LGHT0204:ICE43:组件cmpStartMenuShortcut具有未公布的快捷方式.它的[原文如此] KeyPath注册表项应属于HKCU.

错误LGHT0204:ICE57:组件'cmpStartMenuShortcut'具有每台用户和每台机器的数据以及每台机器的KeyPath.

我不明白为什么钥匙必须在HKCU下.

windows-installer wix wix3.5

21
推荐指数
1
解决办法
7629
查看次数

设置迭代顺序因运行而异

为什么Python集的迭代顺序(具有相同的内容)因运行而异,以及从运行到运行使其一致的选项是什么?

我知道Python集的迭代顺序是任意的.如果我将'a','b'和'c'放入一个集合然后迭代它们,它们可能会以任何顺序返回.

我观察到的是,在一个程序的运行中,顺序保持不变.也就是说,如果我的程序连续两次迭代同一个集合,那么我两次都得到相同的顺序.但是,如果我连续两次运行程序,则顺序会从运行更改为运行.

不幸的是,这打破了我的一个自动化测试,它简单地比较了我的程序的两次运行的输出.我不关心实际的顺序,但我希望它在运行之间保持一致.

我提出的最佳解决方案是:

  1. 将该集复制到列表.
  2. 对列表应用任意排序.
  3. 迭代列表而不是集合.

有更简单的解决方案吗?

注意:我在StackOverlow上发现了类似的问题,但是没有一个能解决从运行到运行获得相同结果的特定问题.

python iteration set

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

是否有STL算法来查找序列中值的最后一个实例?

使用STL,我想找到序列中某个值的最后一个实例.

此示例将在int的向量中找到0 的第一个实例.

#include <algorithm>
#include <iterator>
#include <vector>

typedef std::vector<int> intvec;
intvec values;
// ... ints are added to values
intvec::const_iterator split = std::find(values.begin(), values.end(), 0);
Run Code Online (Sandbox Code Playgroud)

现在我可以用split做事的子范围begin().. splitsplit.. end().我想做类似的事情,但是将split设置为0 的最后一个实例.我的第一个本能就是使用反向迭代器.

intvec::const_iterator split = std::find(values.rbegin(), values.rend(), 0);
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为split它是错误类型的迭代器.所以......

intvec::const_reverse_iterator split = std::find(values.rbegin(), values.rend(), 0);
Run Code Online (Sandbox Code Playgroud)

但现在的问题是我不能使"头"和"尾"范围像begin(), split,split, end()因为那些不是反向迭代器.有没有办法将反向迭代器转换为相应的前向(或随机访问)迭代器?有没有更好的方法来查找序列中元素的最后一个实例,以便我留下兼容的迭代器?

c++ algorithm stl find

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