【问题标题】:MIN/MAX Macros not working with visual studioMIN/MAX 宏不适用于 Visual Studio
【发布时间】:2017-02-08 04:10:11
【问题描述】:

我正在尝试编写一些需要在 Visual Studio 和 linux (gcc) 环境中编译/运行的代码。当我尝试在 Windows 中编译我的文件时,我遇到了一个有点模棱两可的错误,我想知道是否有人可以指出我所缺少的...我有标准宏:

#define __MAX(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })

然后当我尝试调用它时:

        int x = __MAX(0, 2);

我在 Visual Studio 中收到 expected an expression 错误,指向这条线。我是视觉工作室的新手,所以我不确定它不喜欢这个。谁能指出我做错了什么?

【问题讨论】:

  • 没有回答问题,但为什么不使用 100% 便携的 std::minstd::max
  • @NathanOliver 不幸的是,std::minstd::max 在 Windows 中并不总是有效,因为 <Windows.h> 有用于 minmax 的宏,它们会与之发生冲突。是的,这很有趣。 IIRC,如果您在包含<Windows.h> 之前定义它,则有一个宏可以禁用它们。无论哪种方式,它都很糟糕。
  • @NathanOliver No. <Windows.h> 定义了名为 minmax 的宏。所以他们会将宏替换为std::min 并将其转换为std:: a < b ? a : b,这是一个语法错误。 (stackoverflow.com/questions/11544073/…)
  • @Mysticial Oh c***。忘了那个。是的,在 MS 上完全是 BS。
  • #include <windows.h> 之前只需#define NOMINMAX 就可以了。

标签: c++ c visual-studio macros


【解决方案1】:

typeof 的东西是 gcc 特有的。使用 cl.exe(Visual Studio 使用的微软编译器)进行编译时,您没有这些东西。 https://social.msdn.microsoft.com/Forums/vstudio/en-US/984ae3e8-6391-45b9-8885-edb088da8bfa/will-msvc-support-a-typeof-operator-like-in-gcc?forum=vclanguage

【讨论】:

  • 仅链接的答案很难看(保持良好的形式)。
  • 谢谢。我以为它是标准 C,但猜不是。我将创建宏的 Windows 版本。我不认为 windows 有防止在宏中重复副作用的方法?
  • @user2766918 如果你只想要 C,那么你一开始就不应该使用 C++ 标签。顺便说一句,您可以通过 mingw 在 Windows 上使用 gcc。
  • @user2766918 - 如果你的意思是 C++ 标签,你可以使用内联函数而不是宏。这样可以避免重新评估参数。
  • 原始程序是用 C 语言编写的,用于 linux 发行版。 Visual Studio 版本虽然使用 C++ 编译器。此特定宏用于共享代码,因此需要使用 C 和 C++ 编译器进行编译。我突然想到,当我发布这可能是 C++ 特定的东西而不是 Visual Studio 特定的东西时,所以我包含了一个 C++ 标记。由于 windows 使用的是 C++,我可以用 ifdef WINDOWS 中的内联函数替换宏
【解决方案2】:

如果问题是 std::maxstd::min 不起作用,由于宏,您可以在本地禁用它们,如下所示:

#define DONT_EXPAND_MACRO

template<template T>
const T mini(const T& a, const T& b)
{
    using std::min;
    return min DONT_EXPAND_MACRO (a, b);
}

【讨论】:

    猜你喜欢
    • 2015-09-28
    • 2016-10-26
    • 2010-11-15
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多