史蒂夫告诉我,VC 2015和VC 2017实际上(将要)二进制兼容.
我找到了零信息.这在2017年的发行说明(RC)中 - 或几乎在任何地方,所以这里是:
Visual Studio 2017 (v141)Visual Studio 2015 (v140)(*):是啊,其实我去进取,安装了2017年的RC,从我能在表面上看到的,至少在相同 MSVCRT被使用,这是msvcp140.dll和vcruntime140.dll(尽管平台工具集被称为"V141".
visual-studio visual-c++ visual-c++-2015 visual-studio-2017 visual-c++-2017
在Visual C ++ 2017(带有/std:c++14或带有/std:c++17)中,以下代码有效:
void TakePtr(char*); // const or not
int main()
{ 
     TakePtr(char{});
     TakePtr(char());
}
我不明白为什么会这样。
显然,以下内容也将起作用(按预期方式):
void TakeChar(char);
   TakeChar(char{});
   TakeChar(char());
编译器如何演绎(或转换)的类型char来char*时char{}或char()用作论据?
现在,如果我同时拥有char和char*重载,那么它可以正常工作而不会出现任何错误/警告歧义:
void TakePtr(char*);
void TakePtr(char);
    TakePtr(char{});  // Chooses 'char'
    TakePtr(char());  // Chooses 'char'
为什么编译器可以接受char{}for TakePtr(char*)?当选择更好的版本时,为什么不给出警告/错误?这种行为势必会破坏现有代码。
当然,编译器对以下内容不满意:
void TakePtr(char*);
    char c{};
    TakePtr(c);
随着Microsoft在其最新版本中更改注册表项的模式,我如何检测是否在计算机上安装了Visual C++ 2017 Redistributable?
我的目标是安装VC++ 2015Redist,因为该软件是使用VS2015编写的.如果我能在一台机器上成功检测到VC++ 2017Redist,那么我跳过安装VC++ 2015Redist
redistributable visual-c++ vcredist visual-c++-2015 visual-c++-2017
刚刚安装了VS2017,声称自2015年以来拥有出色的C++ 14支持(这是初步的).给我的一个项目使用了一个旋转constexpr,并注意到似乎是一些回归.
这段代码:
struct s
{
    size_t i;
    constexpr s(nullptr_t) noexcept : i(0) {}
};
static_assert(s(nullptr).i == 0, "!!");
在VS2015和Clang上编译没问题,但我在VS2017中遇到一个新错误:
error C2131: expression did not evaluate to a constant
note: failure was caused by unevaluable pointer value
note: while evaluating 's::s(&s{(null)})'
这段代码看起来不错吧?是否constexpr有问题nullptr?
我很惊讶这个基本可能出现的回归,我怀疑我的代码一定有问题......
我正在使用Visual Studio 2017.当我尝试构建解决方案时,遇到此错误:
找不到资源编译器DLL.请确保路径正确.
我检查了我的系统,发现我的机器上安装了v7.0,v8.0,v8.0A,v8.1A和v10.0A SDK.我检查了我的项目属性,默认SDK是v8.0
我有一个简单的单成员结构,删除了复制结构/赋值,以及默认的移动构造/赋值.我试图通过值将这些结构中的一个传递给函数并返回该成员 - 非常简单.
struct NoCopy {
    explicit NoCopy(int x) : x{x} {}
    NoCopy(const NoCopy&) = delete;
    NoCopy& operator=(const NoCopy&) = delete;
    NoCopy(NoCopy&&) = default;
    NoCopy& operator=(NoCopy&&) = default;
    int x;
};
// noinline to ensure the crash is reproducible in release
// not required to reproduce the problem code
__declspec(noinline) int problem_function(NoCopy x) {
    return x.x;
}
int main() {
    return problem_function(NoCopy{ 1 });
}
问题是当使用MSVC编译时,此函数崩溃.
查看反汇编,看起来当删除复制构造函数时,MSVC会尝试将其解释x为a NoCopy*,并且后续成员读取会导致分段错误.
这是一个godbolt的例子,用gcc和clang作为参考:https://godbolt.org/z/jG7kIw
请注意,gcc和clang都按预期运行.另请注意,这在优化和未优化的构建中都会发生,并且似乎会影响MSVC 2015和2017.
作为参考,我正在使用Visual Studio Professional 2015(14.0.25431.01 …
我刚刚进入并发编程.最有可能我的问题很常见,但由于我找不到一个好名字,我不能谷歌.
我有一个C++ UWP应用程序,我尝试应用MVVM模式,但我想这种模式甚至是UWP是不相关的.
首先,我有一个公开操作的服务接口:
struct IService
{
    virtual task<int> Operation() = 0;
};
当然,我提供了一个具体的实现,但它与此讨论无关.该操作可能长时间运行:它发出HTTP请求.
然后我有一个使用该服务的类(同样,省略了不相关的细节):
class ViewModel
{
    unique_ptr<IService> service;
public:
    task<void> Refresh();
};
我使用协同程序:
task<void> ViewModel::Refresh()
{
    auto result = co_await service->Operation();
    // use result to update UI
}
每分钟在计时器上调用Refresh函数,或者响应用户请求.我想要的是:如果在启动或请求新操作时刷新操作已在进行中,则放弃第二个操作并等待第一个操作完成(或超时).换句话说,我不想将所有调用排队到刷新 - 如果调用已在进行中,我宁愿跳过一个调用,直到下一个计时器滴答.
我的尝试(可能非常天真)是:
mutex refresh;
task<void> ViewModel::Refresh()
{
    unique_lock<mutex> lock(refresh, try_to_lock);
    if (!lock)
    {
        // lock.release(); commented out as harmless but useless => irrelevant
        co_return;
    }
    auto result = co_await service->Operation();
    // use result to update UI
}
在原帖后编辑:我在上面的代码片段中注释掉了这一行,因为它没有任何区别.问题仍然存在. …
我正在将C++控制台应用程序与Boost链接起来.一切都很好,直到我开始使用Boost日志库.我正面临这个问题:
boost_log_abi': value 'v2s_mt_nt6' doesn't match value 'v2s_mt_nt5
我在这个问题上尝试了一切.然而,没有任何效果.
我甚至无法理解究竟是什么问题.哪一个使用旧版本,我的程序还是提升?
我在Windows 10,MSVC 2017(141工具集)和Boost 1.63.
如果我在我的机器上只安装Visual C++ 2017 Redistributable,它是否可以支持为2015年编写的应用程序
换句话说,如果我卸载Visual C++ 2015 Redistributable并安装Visual C++ 2017 Redistributable,那么所有应用程序都可以正常运行吗?
c++ redistributable vcredist visual-c++-2015 visual-c++-2017
根据非类型成员的类型,相同模板函数的变体是否有效?
template<typename T, unsigned int V>
void f(unsigned int& v) { v = V; }
template<typename T, bool B>
void f(bool& b) { b = B; }
目的是让人能够打电话
unsigned int meaningOfLife;
f<sometype, 42>(meaningOfLife);
bool areYouAlive;
f<sometype, true>(areYouAlive);
铿锵声和gcc声音沉默,但MSVC报道
warning C4305: 'specialization': truncation from 'int' to 'bool'
我想避免要求指定常量类型:
f<sometype, bool, true>
并希望确保常量值和目标值匹配.
---- mcve ----
#include <iostream>
template<unsigned int V>
void f(unsigned int& v) { v = V; }
template<bool B>
void f(bool& b) { b = B; }
int main() …我刚刚将项目从Visual C ++ 2012升级到了Visual C ++ 2017,并且我从MSBuild中遇到构建失败的问题:
C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Professional \ Common7 \ IDE \ VC \ VCTargets \ Microsoft.Cpp.Current.targets(64,5):错误MSB4062:无法加载“ SetEnv”任务从程序集C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Professional \ Common7 \ IDE \ VC \ VCTargets \ Microsoft.Build.CppTasks.Common.dll。无法加载文件或程序集“ Microsoft.Build.Utilities.Core,版本= 15.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a”或其依赖项之一。该系统找不到指定的文件。确认声明正确,程序集及其所有依赖项均可用,并且任务包含实现Microsoft.Build.Framework.ITask的公共类。[C:\ src \ my-project.vcxproj]
Fusion日志显示了坏消息:
*** Assembly Binder Log Entry  (2/12/2018 @ 1:44:29 PM) ***
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the …我有VC ++ 2017的源, 当我尝试编译项目时,收到错误“ 错误C1083无法打开包含文件:'QtCore / QMap':没有这样的文件或目录 ”。我下载了Qt库并将其添加到“包含”项目中,但是存在问题。我必须将Qt的哪个目录添加到项目中才能解决错误?
这是我的代码的头,会产生错误
#include <QtCore/QMap>
#include <QtCore/QString>
#include <QtCore/QList>
这个帖子: Visual-C++ - 2017二进制兼容VC++ - 2015?清楚地说,VS 2017与VS 2015是二进制兼容的.它甚至看起来像官方立场.
我的问题是,在过去,我清楚地记得每当我尝试将使用不同版本的MSVC编译的静态库链接到EXE中时,遇到链接器错误(我不记得具体的错误集)使用较新版本的MSVC构建.
然而,二进制(in)兼容性听起来像是在运行时会在你脸上爆炸的东西,而不是链接时间.
有人能告诉我,以前版本的MSVC是否确实生成了版本不匹配的链接器错误?这是如何完成的?
这如何影响打开WPO/LTCG时构建的静态库?我相信这些产生了中间目标文件(而不是COFF),并且Microsoft不保证这些中间文件的格式在不同版本的编译器中保持停滞.