我想创建一个函数来检查参数是否超出范围.
我写了这个:
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)
如何制作一个安全地处理所有类型的功能?
当我们有这些时:
auto city1 = "New " L"Delhi";
auto city2 = L"New " "York";
Run Code Online (Sandbox Code Playgroud)
任何VS2015之前的编译器都会引发错误:
错误C2308:连接不匹配的字符串
但是使用VC2015编译器,它编译得很好,结果类型(auto演绎)是一个宽字符串.
我的问题是:何时以及如何实现这一点 - 任何标准规范?
众所周知,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 上编译得很好。
这样做安全吗?
描述:递归删除指定键的子键和值。
签名: LONG WINAPI RegDeleteTree(HKEY, LPCTSTR)
最低支持:Vista
包括: Winreg.h/Advapi32.lib
描述:删除一个子项及其所有后代。此函数从注册表中删除键和所有键的值。
签名: LSTATUS SHDeleteKey (HKEY, LPCTSTR)
最低支持:XP
包括: Shlwapi.h/Shlwapi.lib
看起来它们都用于递归删除注册表。并且它们的参数签名几乎相同。
是RegDeleteTree的只是改良版本SHDeleteKey使用不同的名称?我应该改用更新的RegDeleteTree还是它们之间有一些区别?
我目前正在尝试调用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()操作的返回值仅仅是一个临时表达式结果,因此在内存中没有可识别的位置,我可以从中获取地址.
我想,必须有一种方法可以在一个声明中实现这一点.
任何人都可以向我解释为什么这不起作用,我怎么可能解决它?
我正在编写一个小应用程序,用于监视某个目录中是否有新添加的文件。
我想将监控代码放在一个单独的线程中,这样我就可以让主线程自由用于其他事情,并在需要时取消监控线程。
我能够正确地编写所有内容,除了一件事:
我无法正确退出监控线程,因此发表了这篇文章。
我在主线程中发出一个事件对象信号,等待线程退出,然后进行清理。
问题在于我的使用,ReadDirectoryChangesW因为在我注释掉那段代码后一切正常。
一旦事件句柄发出信号,ReadDirectoryChangesW就会阻塞线程,防止它“捕获”事件并退出。如果我在目录中添加一个新文件,它会“解锁” ReadDirectoryChangesW,线程“捕获”事件并退出。
为了进一步提供帮助,我在下面制作了一个小型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
|正如我所知,管道符号在正则表达式中用作一种"任一"语句.无论是这个,还是那个,或那个等......
但是,我希望检查带有正则表达式的字符串,以确定是否存在此符号.我试过逃避它,但这似乎不起作用.
我该怎么做,特别是如果我已经检查了多个符号,比如#,&,@等......
我可以GetFileInformationByHandle用来确定与文件关联的硬链接数.如何枚举构成这些链接的路径?
例如,如果C:\TEMP_1.BIN和C:\TEMP_2.BIN是硬链接到相同的内容,我从确定GetFileInformationByHandle那C:\TEMP_1.BIN已经nNumberOfLinks=2,我怎么能找到另一条链路的路径?(例如C:\TEMP_2.BIN)
GetFileInformationByHandle:http:
//msdn.microsoft.com/en-us/library/aa363788%28v=VS.85%29.aspx
我有一个简单的内联汇编函数,它在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)