【问题标题】:Function returning reference not working with window.h函数返回引用不适用于 window.h
【发布时间】:2013-04-21 16:12:56
【问题描述】:
1: #include <windows.h>

2: int& max(int& a, int& b)
3: {
4:   return a > b ? a : b;
5: }

6: int main()
7: {
8:   return 0;
9: }

Visual Studio 2008 Express Edition 喊道:

1>e:...\main.cpp(2) : error C2062: type 'int' unexpected

1>e:...\main.cpp(2) : error C2062: type 'int' unexpected

1>e:...\main.cpp(2) : 错误 C2059: 语法错误: ')'

1>e:...\main.cpp(3) : 错误 C2143: 语法错误: 缺少 ';'在'{'之前

1>e:...\main.cpp(3) : 错误 C2447: '{' : 缺少函数头(旧式正式列表?)

如果我将 windows.h 替换为 stdio.h 或 iostream(或者如果我删除它),它似乎可以工作

这是为什么?

【问题讨论】:

  • 我猜你的windows.h 不知何故损坏了。您是否碰巧在文本编辑器中打开它以查看其中的内容?您可能误编辑了它。
  • windows.h 有 min 和 max 宏。
  • 在此处返回引用时要非常小心 - 在 99% 的情况下,这不是您想要的(例如,对于您的代码,这将不起作用:max(4, 5) )。不要害怕按值返回,它是高效的,并且会避免不必要的复制。

标签: c++ visual-studio function reference


【解决方案1】:
#include <windows.h>

#undef min
#undef max

int & max(int& a, int& b)
{
    return a > b ? a : b;
}
int main()
{
    return 0;
}

&lt;windows.h&gt; 定义了 maxmin 的宏,它们会干扰你的。

其他方式

  • 重命名函数。

  • 使用NOMINMAX。这是推荐使用一些自行定义最小值和最大值的 STL 标头的常见解决方案。

    #define NOMINMAX
    #include <windows.h>
    

【讨论】:

  • 还有另一种(恕我直言)方法:只需在包含 windows.h 之前定义 NOMINMAX (或使用编译器标志添加定义)。这将阻止 windows.h 定义这两个宏。
  • @ollb 否。显然在某些情况下会失败(尽管我怀疑那些情况是它被某种方式遗忘了;通过编译器选项定义它应该是安全的)。
  • 嗯,我个人从来没有遇到过NOMINMAX 的问题,我认为应该在这里提及。另外@user93353 据我所知WINDOWS_LEAN_AND_MEAN 不会包含NOMINMAX 的效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 2023-03-31
  • 2018-12-15
  • 2021-07-14
  • 1970-01-01
  • 2020-01-17
相关资源
最近更新 更多