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

Mor*_*ori 5 c++ compiler-warnings suppress-warnings eigen visual-studio-2013

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

问题:为什么我可以禁用某些警告,而即使某些警告本来应该被禁止,却仍然存在?

更多内容
我得到的“表现良好”警告是

警告C4714:函数'const Eigen :: Matrix Eigen :: DenseBase :: eval(void)const'被标记为__forceinline

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

 #pragma警告(禁用:4714) 

很好地抑制了它。

“顽皮”警告是

警告C4996:'std :: _ Partial_sum2':具有可能不安全的参数的函数调用-此调用依赖于调用者检查传递的值是否正确。要禁用此警告,请使用-D_SCL_SECURE_NO_WARNINGS。请参阅有关如何使用Visual C ++“检查的迭代器”的文档
源于特征的ChordLengths函数。但是,这一点不能让自己被压制
#pragma警告(禁用:4996)
(而且我很确定间距没有问题,或者上面的4714效果很好),但都没有用

#定义_SCL_SECURE_NO_WARNINGS
#定义_CRT_SECURE_NO_WARNINGS

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


这是为什么?我会忽略明显的东西吗?

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

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

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

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

Mor*_*ori 1

感谢 WhozCraig 解决

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