小编The*_*ign的帖子

FindFirstFile没有文档的通配符或bug?

MSDN说:

HANDLE WINAPI FindFirstFile( LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData );
Run Code Online (Sandbox Code Playgroud)

lpFileName 目录或路径以及文件名,可以包含通配符,例如星号(*)或问号(?)......

直到今天我还没有注意到"例如".

假设您有一个"c:\ temp"目录,下面的代码显示"temp".注意搜索到的目录:"c:\ temp>".如果你有一个"c:\ temp1"目录和一个"c:\ tem"目录,FindNextFile会找到"temp1",但是找不到"tem".我认为'<'会找到"tem",但我错了:它的行为方式相同.你附加了多少'<'/'>并不重要:行为是一样的.

从我的角度来看,这是一个错误('>'&'<'不是文件名中的有效字符).从微软的角度来看,它可能是一个功能.

我没有设法找到F*F行为的完整描述.

const TCHAR* s = _T("c:\\temp>");
  {
    WIN32_FIND_DATA d;
    HANDLE h;

    h = FindFirstFile( s, &d );
    if ( h == INVALID_HANDLE_VALUE )
    {
      CString m;
      m.Format( _T("FindFirstFile failed (%d)\n"), GetLastError() );
      AfxMessageBox( m );
      return;
    }
    else
    {
      AfxMessageBox( d.cFileName );
      FindClose( h );
    }
  }
Run Code Online (Sandbox Code Playgroud)

编辑1:

首先,我尝试使用Windows实现_stat.它与非法字符"*"和"?"一起工作正常,但忽略了">",所以我介入并注意到实现特别注意了记录的通配符.我以FFF结束了.

编辑2:

我填写了两个错误表单:一个用于FFF,另一个用于_stat.我现在正在等待MS的回答.

我不认为窥视一些应该是黑盒子和推测的东西是正常的.因此,我的反对意见是基于"合同"所说的:"lpFileName [in]目录或路径,以及文件名,可以包含通配符,例如,星号(*)或问号(?) ......."我不是母语为英语的人.也许这意味着"这些不是唯一的通配符",也许不是.但是,如果这些不是唯一的通配符,它​​们应该列出所有(可能是它们).在这一点上,我认为MS的分辨率将是"按设计"或"无法修复".

关于_stat,我认为它是一个ISO函数,MSDN说:"返回值:如果获得文件状态信息,这些函数中的每一个都返回0."它没有说明有关通配符的事情,无论是否记录.我没看到_stat可以从"c:\ temp*"或"c:\ temp >>"中检索哪种信息.某人依赖当前行为的可能性极小,因此他们可能会发布修复程序.

编辑3:

微软已将_stat错误关闭为已修复. …

c++ windows winapi

13
推荐指数
1
解决办法
2455
查看次数

VC 2015 U3 - ASSERT崩溃了应用程序

VS 14.0.25431.01更新3

Windows 10 - 10.0.10240 Build 10240

脚步:

  1. 创建一个新的MFC应用程序.
  2. 添加ASSERT( 0 )CAboutDlg::CAboutDlg,例如.
  3. 构建调试版本.
  4. 无需调试即可运行(Ctrl+ F5).
  5. 单击关于 - >程序默默地中止
  6. 开始调试(F5)
  7. 单击关于 - > 断点对话框.

微软已经将这个错误称为"按设计":"基于对所提供信息的审查,我们已将此问题解决为"按设计".我们无法在此处发现任何意外行为."

适用于Win7.

我正在寻找一种解决方法.

[编辑] 我发现,__acrt_get_developer_information_policy()正在恢复developer_information_policy_none,而不是预期developer_information_policy_ui(见common_show_message_boxcrtmbox.cpp),但我对如何去改变它没有任何线索.

[编辑]看到这个链接,这一个,微软连接.

[编辑]最新的Windows 10 SDK修复了我的机器上的问题.所有信用都转到cubee_72(MS帐户).

[编辑]最新的SDK只解决了Ctrl+ 的问题F5.如果存在调试器,则仍会显示断点对话框,而不是断言对话框.

[编辑2017-11-20] MS删除了我的错误报告.


谢谢.

c++ mfc visual-studio-2015

8
推荐指数
1
解决办法
538
查看次数

VC2019:编译器错误、std::pair 错误或模糊功能

下面的代码使应用程序崩溃或打印出乱码。如果基类的初始化被替换为str_int{ string{V}, 0}那么它就可以正常工作。似乎与一些在线编译器一起工作得很好。

#include <iostream>
#include <utility>

using namespace std;

using str_int = pair<string, int>;

template< const char* V > 
struct C : public str_int
{
  C() : str_int{ V, 0} {}
};

constexpr const char str[] = "abc";

int main()
{
  // works fine
  str_int si{str, 0};
  cout << si.first;

  // crashes the application or prints gibberish
  C<str> c;
  cout << c.first;
}
Run Code Online (Sandbox Code Playgroud)

c++ c++17 visual-c++-2019

6
推荐指数
1
解决办法
113
查看次数

C++ Lambda - 错误:没有用于调用的匹配函数

我试图将一个 lambda 作为参数传递给一个函数,但是一旦我尝试访问一个在 lambda 内部声明的变量,该变量在外部声明,构建就会失败: error: no matching function for call to 'AWS::subscribe(char [128], mainTask(void*)::<lambda(AWS_IoT_Client*, char*, uint16_t, IoT_Publish_Message_Params*, void*)>)'

我在想这[&]会处理捕获变量。我也试过[=],以及[someVar][&someVar]

我正在使用 C++11。

char someVar[128];

aws->subscribe(
  topic,
  [&] (AWS_IoT_Client *pClient, char *topicName, uint16_t topicNameLen, IoT_Publish_Message_Params *params, void *pData) {
    char *text = (char *)params->payload;
    sprintf(someVar, "%s", text);
  }
);
Run Code Online (Sandbox Code Playgroud)

从 AWS 库:

void AWS::subscribe(const char *topic,
                    pApplicationHandler_t iot_subscribe_callback_handler) {
  m_error =
      ::aws_iot_mqtt_subscribe(&m_client, topic, (uint16_t)std::strlen(topic),
                              QOS1, iot_subscribe_callback_handler, NULL);

}
Run Code Online (Sandbox Code Playgroud)

c++ lambda closures c++11

3
推荐指数
1
解决办法
1746
查看次数

未命名命名空间中“使用命名空间”的范围

为什么 using 指令using namespace std;in当包含在匿名命名空间中时表现得好像它出现在全局范围内?

#include <iostream>

namespace x
{
  using namespace std;
  void g()
  {
    cout << 1;
  }
}

int main()
{
  cout << 1; // compiles fine if `namespace x` is replaced with `namespace`
}
Run Code Online (Sandbox Code Playgroud)

c++ namespaces using-directives

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

元组索引的模板参数推导

template < typename TYPE, typename TUPLE, int INDEX >
void fun( TYPE& a, TUPLE b )
{
  a = std::get<INDEX>( b );
}
Run Code Online (Sandbox Code Playgroud)

调用上面的方法很乏味:

//...
using tuple_t = std::tuple<int, double, double>;
double d;
fun<double, tuple_t, 1>( d, std::make_tuple( 1, 2.3, 4.5 ) );
//...
Run Code Online (Sandbox Code Playgroud)

更好的方法吗?例如:

fun( d, std::make_tuple( 1, 2.3, 4.5 ), 1 );
Run Code Online (Sandbox Code Playgroud)

c++ templates

0
推荐指数
1
解决办法
39
查看次数