小编Aja*_*jay的帖子

比较模板中的不同类型

我想创建一个函数来检查参数是否超出范围.

我写了这个:

template<typename X,typename Y,typename Z >
void checkParameter( X val, Y lower, Z upper)
{
    if( ( val > upper) || ( val < lower) )
    {
        log("checkParameter, val = % , lower= % , upper= %  \n", val,
                          lower,upper );
        ASSERT(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做

uint32_t var = 5000;
checkParameter( var, 0, 262143);
Run Code Online (Sandbox Code Playgroud)

我收到警告:

warning: comparison between signed and unsigned integer expressions
Run Code Online (Sandbox Code Playgroud)

如何制作一个安全地处理所有类型的功能?

c++ templates

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

在VC2015中连接不匹配的字符串WORKS - 如何?

当我们有这些时:

auto city1 = "New "  L"Delhi";
auto city2 = L"New " "York";
Run Code Online (Sandbox Code Playgroud)

任何VS2015之前的编译器都会引发错误:

错误C2308:连接不匹配的字符串

但是使用VC2015编译器,它编译得很好,结果类型(auto演绎)是一个宽字符串.

我的问题是:何时以及如何实现这一点 - 任何标准规范?

c++ c++11 c++14 visual-studio-2015

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

在单个函数中混合 '__try' 和 'try' - 通过 Lambda

众所周知,Windows SEH 不支持 C++ 异常处理机制。我们不能在单一功能中使用try__try。这将导致编译器错误:

__try
{
   try
   {
       MayThrowCPPException_OR_SEH();
   }
   catch(...)
   {
   }
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
Run Code Online (Sandbox Code Playgroud)

它将呈现:

C2713:每个函数只允许一种形式的异常处理。

大多数人不喜欢的一种选择是“Yes with SEH Exceptions ( /EHa )”编译器选项。这将有助于 C++ try/catch 处理这两个异常。我们需要将这样的函数放在单独的文件中,并且只将/EHa放在该源文件中。

另一种选择是将try(或__try) 放入一个函数中,并拥有另一个将具有__try( 或try) 的函数。

问题开始 在尝试执行上述操作时,我尝试使用 C++ lambda 来欺骗编译器。这是我所做的:

auto call_this =[] 
{
   MayThrowCPPException_OR_SEH();
   // C++ exception handling here.
};
__try
{
   call_this();
}
__except(...)
{
}
Run Code Online (Sandbox Code Playgroud)

这在 VC++ 2013 更新 5 上编译得很好。

这样做安全吗?

c++ lambda exception-handling seh c++14

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

SHDeleteKey 和 RegDeleteTree 有什么区别?

注册删除树

  • 描述:递归删除指定键的子键和值。

  • 签名: LONG WINAPI RegDeleteTree(HKEY, LPCTSTR)

  • 最低支持:Vista

  • 包括: Winreg.h/Advapi32.lib

删除键

  • 描述:删除一个子项及其所有后代。此函数从注册表中删除键和所有键的值。

  • 签名: LSTATUS SHDeleteKey (HKEY, LPCTSTR)

  • 最低支持:XP

  • 包括: Shlwapi.h/Shlwapi.lib

看起来它们都用于递归删除注册表。并且它们的参数签名几乎相同。

RegDeleteTree的只是改良版本SHDeleteKey使用不同的名称?我应该改用更新的RegDeleteTree还是它们之间有一些区别?

c c++ windows winapi

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

获取指向由智能指针指向的对象的指针 - Ivalue错误

我目前正在尝试调用sqlite3库函数,它希望我传递它sqlite3**.

这是我目前的代码.我有一个工作部分,一部分给我一个错误:

sqlite3 *sqlite = m_db.get();
if (sqlite3_open(std::string(m_dbName.begin(), m_dbName.end()).c_str(), &sqlite))
{

}

if (sqlite3_open(std::string(m_dbName.begin(), m_dbName.end()).c_str(), &(m_db.get()) ))
{

}
Run Code Online (Sandbox Code Playgroud)

我的m_db字段看起来像这样:

std::unique_ptr<sqlite3> m_db = nullptr;
Run Code Online (Sandbox Code Playgroud)

在我展示的两个例子中,第一个是完美的.但是,第二个给了我这个错误.请注意,这是来自&(m_db.get())部分:

“Address expression must be an lvalue or a function designator”
Run Code Online (Sandbox Code Playgroud)

我读了一些关于左值和右值的内容,但我似乎无法弄清楚为什么这种语法是不可能的.据我所知,现在问题是.get()操作的返回值仅仅是一个临时表达式结果,因此在内存中没有可识别的位置,我可以从中获取地址.

我想,必须有一种方法可以在一个声明中实现这一点.

任何人都可以向我解释为什么这不起作用,我怎么可能解决它?

c++

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

异步 ReadDirectoryChangesW 调用会阻止线程退出

介绍:

我正在编写一个小应用程序,用于监视某个目录中是否有新添加的文件。

我想将监控代码放在一个单独的线程中,这样我就可以让主线程自由用于其他事情,并在需要时取消监控线程。

相关信息:

  • 我正在使用ReadDirectoryChangesW进行监控
  • 我正在使用原始 WIN32 API 进行线程创建/同步
  • 我正在尝试支持 Windows XP 及以上版本。

问题:

我能够正确地编写所有内容,除了一件事:

我无法正确退出监控线程,因此发表了这篇文章。

我在主线程中发出一个事件对象信号,等待线程退出,然后进行清理。

问题在于我的使用,ReadDirectoryChangesW因为在我注释掉那段代码后一切正常。

一旦事件句柄发出信号,ReadDirectoryChangesW就会阻塞线程,防止它“捕获”事件并退出。如果我在目录中添加一个新文件,它会“解锁” ReadDirectoryChangesW,线程“捕获”事件并退出。

为了进一步提供帮助,我在下面制作了一个小型MVCE,它说明了我到目前为止所说的内容。

MVCE:

#include <iostream>
#include <Windows.h>
#include <map>

struct SThreadParams
{
    HANDLE hEvent;
    HANDLE hDir;
    int processDirectoryChanges(const char *buffer)
    {
        if (NULL == buffer) return -1;

        DWORD offset = 0;
        char fileName[MAX_PATH] = "";
        FILE_NOTIFY_INFORMATION *fni = NULL;

        do
        {
            fni = (FILE_NOTIFY_INFORMATION*)(&buffer[offset]);
            // since we do not use UNICODE, 
            // …
Run Code Online (Sandbox Code Playgroud)

c++ winapi multithreading asynchronous readdirectorychangesw

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

使用Regex检查管道符号

|正如我所知,管道符号在正则表达式中用作一种"任一"语句.无论是这个,还是那个,或那个等......

但是,我希望检查带有正则表达式的字符串,以确定是否存在此符号.我试过逃避它,但这似乎不起作用.

我该怎么做,特别是如果我已经检查了多个符号,比如#,&,@等......

php regex

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

http c ++库?

嗨,如果有某种C++库处理HTTP,HTTP,分块等,我很喜欢.谷歌没有找到任何东西.

c++ http libraries

4
推荐指数
1
解决办法
849
查看次数

如何枚举指向文件的所有NTFS硬链接的路径?

我可以GetFileInformationByHandle用来确定与文件关联的硬链接数.如何枚举构成这些链接的路径?

例如,如果C:\TEMP_1.BINC:\TEMP_2.BIN是硬链接到相同的内容,我从确定GetFileInformationByHandleC:\TEMP_1.BIN已经nNumberOfLinks=2,我怎么能找到另一条链路的路径?(例如C:\TEMP_2.BIN)

GetFileInformationByHandle:http: //msdn.microsoft.com/en-us/library/aa363788%28v=VS.85%29.aspx

ntfs hardlink

4
推荐指数
1
解决办法
1432
查看次数

为什么简单的内联汇编功能在GCC中不能正常工作?

我有一个简单的内联汇编函数,它在MSVC中工作正常,但由于某种原因拒绝在Apple GCC 4.2.1(i386 arch,强制32位模式)下工作.幸运的是,更复杂的汇编函数工作得很好,但是我无法理解为什么这个函数不能正常工作...不幸的是,我无法调试它 - 看看事情在XCode 4.0.2中没有寄存器窗口(它是3.2版本).

我很肯定这个问题与英特尔风格的装配无关.

int Convert(double value)
{
     _asm
     {
         fld value
         push eax
         fistp dword ptr [esp]
         pop eax
     }

// The returned value is insane
}
Run Code Online (Sandbox Code Playgroud)

c++ xcode gcc inline-assembly

4
推荐指数
1
解决办法
3777
查看次数