禁止警告C4996:为什么不起作用?

时间:2019-05-14 14:36:35

标签: c++ visual-studio-2013 eigen compiler-warnings suppress-warnings

上下文: 我在玩Eigen库的样条拟合模块。 拟合效果很好,但是我确实收到了一些警告(在Visual Studio 2013中)。

问题: 为什么我可以禁用某些警告,而其他警告即使在应该被抑制后仍然存在?

更多上下文
我收到的“表现良好”警告是

warning C4714: function 'const Eigen::Matrix Eigen::DenseBase::eval(void) const' marked as __forceinline not inlined

经过一番研究,我了解到这确实是使用特征码来实现的。由于我不想发出警告,所以

 #pragma warning(disable : 4714) 

可以很好地抑制它。

“顽皮”警告是

warning C4996: 'std::_Partial_sum2': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
源于特征的ChordLengths函数。但是,这一点不能让自己
#pragma warning(disable : 4996)
来压制 (而且我很确定间距没有问题,或者上面的4714效果很好),都行不通

#define _SCL_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS

this线程或所有其他类似线程中的任何内容。


为什么?我忽略了明显的东西吗?

现在,我以一种相当丑陋的方式“解决”了该问题:我将ChordLengths函数重写为代码,以替换有问题的行

std::partial_sum(chord_lengths.data(), chord_lengths.data()+n,chord_lengths.data());

带有我自己的版本。我不喜欢这种方法,但是可以解决问题。不过,我还是想了解为什么我没有试图抑制警告的方法起作用。

奖金:我实际上如何抑制警告?

2 个答案:

答案 0 :(得分:0)

感谢WhozCraig

解决方案:警告抑制必须放在任何包含之前,因为其中一些显然也包含本征。

答案 1 :(得分:0)

@Mori(对不起,看来我的信誉点太少了,无法添加评论!)

对我来说,在遇到sprintf(等)警告时遇到麻烦,#pragma warning(disable : 4996)必须放在 之后#include "stdafx.h"