我知道根据C++标准,如果新的无法分配内存,它应该抛出std :: bad_alloc异常.但我听说有些编译器如VC6(或CRT实现?)不遵守它.这是真的 ?我问这个是因为在每个新语句之后检查NULL会使代码看起来非常难看.
输入拼写错误后,编译并执行以下表达式(简化):
if((1 == 2) || 0 (-4 > 2))
printf("Hello");
Run Code Online (Sandbox Code Playgroud)
当然,0应该不存在.
为什么要编译,表达式是什么意思?
原始(简化)应如下所示:
if((1 == 2) || (-4 > 2))
printf("Hello");
Run Code Online (Sandbox Code Playgroud)
这没有编译:
if((1 == 2) || true (-4 > 2))
printf("Hello");
if((1 == 2) || 1 (-4 > 2))
printf("Hello");
if((1 == 2) || null (-4 > 2))
printf("Hello");
Run Code Online (Sandbox Code Playgroud) 我试图在Windows 10下使用Visual Studio 2015终极安装在python 3.5中安装numpy.
短版本:vcvarsall.batvs14文件C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC夹文件夹中缺少文件.为什么?
长版:跑步pip install numpy给我这个错误error: Unable to find vcvarsall.bat
研究这个错误让我得到了几个stackoverflow答案,帮助我弄清楚python需要c ++编译器来编译一些包.并且它需要使用用于编译python 3.5的相同版本的编译器来执行此操作( 错误:无法找到vcvarsall.bat).我的python是使用[MSC v.1900 64位(AMD64)]编译的 - 这是vs 14(visual studio 2015)
与我的研究,我从中学到了进一步的运动:
PIP安装提示错误:无法找到vcvarsall.bat是
get_build_version()从$python_install_prefix/Lib/distutils/msvc9compiler.py回报的VS是768,16可以用来寻找路径的版本,vcvarsall.bat
对于我这个方法返回14,所以一切都正确.
现在,当我查看文件夹时C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC,文件vcvarsall.bat丢失了.
但是当我查看文件夹时,C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC有一个vcvarsall.bat.
为什么vs 14.0中缺少vcvarsall.bat?
我正在重构一些旧的代码,并发现很少的结构包含零长度数组(如下).当然,由pragma压制的警告,但我没有通过包含这种结构的"新"结构创建(错误2233).数组'byData'用作指针,但为什么不使用指针呢?或长度为1的数组?当然,没有添加任何评论让我喜欢这个过程...任何使用这种东西的原因?重构那些的任何建议?
struct someData
{
int nData;
BYTE byData[0];
}
Run Code Online (Sandbox Code Playgroud)
NB它是C++,Windows XP,VS 2003
主题标题实际上是我的问题.第二个问题是:我什么时候使用这两个?
我想从cmd运行regasm.exe.可在c:\ windows\Microsoft.net\framework\2.057中找到
我喜欢这个c:\ regasm.exe
它给予regasm不被认为是内部或外部命令.
所以我明白我需要在环境变量中设置regasm.exe的路径.
如上所述,我需要为哪个变量设置运行regasm的路径?
我最近读了很多关于IEEE 754和x87架构的内容.我正在考虑在我正在研究的一些数值计算代码中使用NaN作为"缺失值",我希望使用信令 NaN将允许我在我不想要的情况下捕获浮点异常继续"缺失值".相反,我会使用安静的 NaN来允许"缺失值"通过计算传播.但是,信号NaN不起作用,因为我认为它们将基于它们上存在的(非常有限的)文档.
以下是我所知道的摘要(所有这些都使用x87和VC++):
标准库提供了一种访问NaN值的方法:
std::numeric_limits<double>::signaling_NaN();
Run Code Online (Sandbox Code Playgroud)
和
std::numeric_limits<double>::quiet_NaN();
Run Code Online (Sandbox Code Playgroud)
问题是我认为信号NaN没有任何用处.如果屏蔽了_EM_INVALID,则其行为与安静NaN完全相同.由于没有NaN与任何其他NaN相当,因此没有逻辑差异.
如果未屏蔽_EM_INVALID (启用异常),则甚至无法使用信号NaN初始化变量:
double dVal = std::numeric_limits<double>::signaling_NaN();因为这会引发异常(信号NaN值被加载到x87寄存器以将其存储到存储器地址).
您可以像我一样思考以下内容:
但是,步骤2会导致信令NaN转换为安静的NaN,因此后续使用它不会导致异常被抛出!那么WTF?!
信号NaN是否有任何实用性或目的?我理解其中一个原始意图是使用它初始化内存,以便可以捕获使用单位化浮点值.
有人能告诉我,如果我在这里遗失了什么吗?
编辑:
为了进一步说明我希望做的事情,这里有一个例子:
考虑对数据向量(双精度)执行数学运算.对于某些操作,我想允许向量包含"缺失值"(假设这对应于电子表格列,例如,其中一些单元格没有值,但它们的存在很重要).对于某些操作,我不希望允许向量包含"缺失值".如果集合中存在"缺失值",也许我想采取不同的行动 - 可能执行不同的操作(因此这不是无效的状态).
这个原始代码看起来像这样:
const double MISSING_VALUE = 1.3579246e123;
using std::vector;
vector<double> missingAllowed(1000000, MISSING_VALUE);
vector<double> missingNotAllowed(1000000, MISSING_VALUE);
// ... populate missingAllowed and missingNotAllowed with (user) data...
for (vector<double>::iterator it = missingAllowed.begin(); it != missingAllowed.end(); ++it) …Run Code Online (Sandbox Code Playgroud) 有没有办法override在Visual C++ 2012中强制使用C++ 11 关键字?
(即如果我忘记说override,那么我想得到一个警告/错误.)
我经常使用一种技术,我称之为"懒人enable_if",我使用它decltype和逗号运算符来启用基于某些模板输入的函数.这是一个小例子:
template <typename F>
auto foo(F&& f) -> decltype(f(0), void())
{
std::cout << "1" << std::endl;
}
template <typename F>
auto foo(F&& f) -> decltype(f(0, 1), void())
{
std::cout << "2" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
随着--std=c++11,g ++ 4.7+和Clang 3.5+愉快地编译那段代码(并且它按照我的预期工作).但是,当使用MSVC 14 CTP5时,我得到这个错误抱怨foo已经定义:
错误错误C2995:'unknown-type foo(F &&)':函数模板已经定义了c ++ - scratch main.cpp 15
所以我的问题是:"懒人enable_if"是合法的C++还是这是一个MSVC错误?
visual-c++ ×10
c++ ×8
c++11 ×2
.net ×1
arrays ×1
c ×1
command-line ×1
ieee-754 ×1
managed-c++ ×1
new-operator ×1
overriding ×1
pip ×1
python-2.x ×1
python-3.x ×1
sfinae ×1
visual-c++-6 ×1
x87 ×1