【问题标题】:Min and max functions with Visual StudioVisual Studio 的最小值和最大值函数
【发布时间】:2016-01-27 18:29:10
【问题描述】:

我的项目的一个头文件(lib.hpp 文件)中有以下代码:

#ifndef SLIM_MATHS_LIB_HPP_
# define SLIM_MATHS_LIB_HPP_

namespace slim
{
namespace maths
{

namespace lib
{
template <typename T>
inline T        min(T a, T b); // Many errors on this line (see below)
// Other functions
}
}
}

# include "lib.ipp" // Functions definitions are inside

#endif // !SLIM_MATHS_LIB_HPP_

它在 GNU/Linux 系统上编译并与 GCC 配合得非常好。

现在我尝试在 Windows 10 上使用 Visual Studio 14.0 编译它,但在 min 函数定义行出现大量错误,如下所示:

错误 C2146 语法错误:标识符前缺少 ')' 'a' slim3d-core C:\Users\msi\Desktop\SLIM3D\inc\slim\maths\lib.hpp 23
错误 C2433 'T': 不允许在数据上使用'inline' 声明 slim3d-core C:\Users\msi\Desktop\SLIM3D\inc\slim\maths\lib.hpp 23
错误 C2365 'T':重新定义;以前的定义是'模板 参数' slim3d-core C:\Users\msi\Desktop\SLIM3D\inc\slim\maths\lib.hpp 23
错误 C2061 语法错误:标识符 'a' slim3d-core C:\Users\msi\Desktop\SLIM3D\inc\slim\maths\lib.hpp 23
错误 C2059 语法错误: ')' slim3d-core C:\Users\msi\Desktop\SLIM3D\inc\slim\maths\lib.hpp 23
错误 C2146 语法错误:标识符前缺少 ')' 'b' slim3d-core C:\Users\msi\Desktop\SLIM3D\inc\slim\maths\lib.hpp 23
错误 C2146 语法错误:缺少 ';'在标识符之前 'b' slim3d-core C:\Users\msi\Desktop\SLIM3D\inc\slim\maths\lib.hpp 23

我已经在 Windows 7 系统上使用 Visual Studio 14.0 成功编译了它,但是 lib.hpplib.ipp 分别被命名为 lib.hhlib.hpp,所以我认为这是 Windows 10 的系统问题或扩展问题。
也许 Visual Studio 拒绝将 .ipp 文件的内容视为 C++ 代码,因为当我打开它时它不会将其着色为代码。但是,由于它包含在 .hpp 文件中,而不是直接添加到解决方案中,因此应该没有区别。

【问题讨论】:

  • 只是一个想法 - 如果您只使用 cl /E 进行预处理,您会看到 inline T min(T a, T b); 行的什么输出?我问是因为如果某些标题有 #define min(a, b),它可能会干扰您的版本。
  • 类似的问题,虽然是关于尝试使用std::min,但有一个有用的答案提到NOMINMAX here

标签: c++ visual-studio-2015 windows-10 file-extension


【解决方案1】:

min 被定义为windows.h 中的宏。在声明函数之前,在标题中添加 #undef min 行。

【讨论】:

  • 这就是为什么宏是邪恶的。
  • @NeilKirk:甚至更多 - 为什么 Microsoft Visual C++ 是邪恶的:用于定义常用标题的疯狂宏......
  • @TonyD 它可能一直追溯到 Windows 1.0 时代,将其删除会破坏太多现有代码,这是 MS 似乎想要避免的。他们可以将其更改为选择加入(使用定义)而不是使用NOMINMAX 选择退出。
猜你喜欢
  • 2015-10-29
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 2023-04-02
相关资源
最近更新 更多