C++ 最小/最大宏不适用于visual studio

C++ 最小/最大宏不适用于visual studio,c++,c,visual-studio,macros,C++,C,Visual Studio,Macros,我正在尝试编写一些需要在VisualStudio和linux(gcc)环境中编译/运行的代码。当我试图在windows中编译我的文件时,我得到了一个有点模糊的错误,我想知道是否有人能指出我缺少的东西。。。我有标准宏: #define __MAX(a,b) \ ({ __typeof__ (a) _a = (a); \ __typeof__ (b) _b = (b); \ _a > _b ? _a : _b; }) 然后当我试图调用它时: in

我正在尝试编写一些需要在VisualStudio和linux(gcc)环境中编译/运行的代码。当我试图在windows中编译我的文件时,我得到了一个有点模糊的错误,我想知道是否有人能指出我缺少的东西。。。我有标准宏:

#define __MAX(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })
然后当我试图调用它时:

        int x = __MAX(0, 2);

我在VisualStudio中得到一个
预期的表达式
错误,指向这一行。我是VisualStudio的新手,所以我不确定它不喜欢这个。有人能指出我做错了什么吗

内容的类型是gcc特有的。在使用cl.exe(visual studio使用的microsoft编译器)编译时,您没有这些东西

内容的类型是gcc特有的。在使用cl.exe(visual studio使用的microsoft编译器)编译时,您没有这些东西

如果问题是
std::max
std::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);
}
#定义不展开宏
模板
小型常数T(常数T&a、常数T&b)
{
使用std::min;
返回最小不展开宏(a,b);
}

如果问题是
std::max
std::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);
}
#定义不展开宏
模板
小型常数T(常数T&a、常数T&b)
{
使用std::min;
返回最小不展开宏(a,b);
}

没有回答这个问题,但是为什么不使用100%可移植的
std::min
std::max
呢?@NathanOliver不幸的是,
std::min
std::max
并不总是在Windows中工作,因为
具有与之冲突的
min
max
宏。是的,很搞笑。IIRC,如果在包含
之前定义了宏,则有一个宏可以禁用这些。不管怎样,它都很糟糕。@NathanOliver No.
定义了名为
min
max
的宏。因此,他们将把宏替换为
std::min
,并将其转换为
std::a
这是一个语法错误。()@神秘的Oh c***。忘了那个。是的,MS上的总BS。只需在
之前定义NOMINMAX
,包括
,你就可以了。没有回答问题,但为什么不使用100%便携的
std::min
std::max
std::min
std::max
并不总是在Windows中工作,因为
min
max
的宏,这两个宏会与之冲突。是的,很搞笑。IIRC,如果在包含
之前定义了宏,则有一个宏可以禁用这些。不管怎样,它都很糟糕。@NathanOliver No.
定义了名为
min
max
的宏。因此,他们将把宏替换为
std::min
,并将其转换为
std::a
这是一个语法错误。()@神秘的Oh c***。忘了那个。是的,MS上的总BS。在
#包含
之前定义NOMINMAX
,你就没事了。只有链接的答案很难看(为了保持良好的形式)。谢谢。我以为是标准的C,但我猜不是。我将创建宏的windows版本。我不认为Windows有一个方法来防止宏中的重复副作用。@ USER 2666 918如果你只想C,你不应该首先使用C++标签。顺便说一下,你可以在Windows上通过GINW使用GCC。@ USER 2666 918——如果你是C++标记的任何东西,你可以使用内联函数而不是宏。这避免了重新评估参数。原始程序是为linux发行版用C编写的。VisualStudio版本使用C++编译器。这个特定的宏用于共享代码,因此需要用C和C++编译器编译。在我发布的时候,我发现这可能是C++特定的,而不是VisualStudio特定的,所以我包含了C++标签。由于Windows正在使用C++,所以我可以在代码< iFDEF Windows < /C>链接中用内联函数替换宏。只有答案是丑陋的(保持优美的形式说)。谢谢。我以为是标准的C,但我猜不是。我将创建宏的windows版本。我不认为Windows有一个方法来防止宏中的重复副作用。@ USER 2666 918如果你只想C,你不应该首先使用C++标签。顺便说一下,你可以在Windows上通过GINW使用GCC。@ USER 2666 918——如果你是C++标记的任何东西,你可以使用内联函数而不是宏。这避免了重新评估参数。原始程序是为linux发行版用C编写的。VisualStudio版本使用C++编译器。这个特定的宏用于共享代码,因此需要用C和C++编译器编译。在我发布的时候,我发现这可能是C++特定的,而不是VisualStudio特定的,所以我包含了C++标签。由于Windows正在使用C++,所以我可以在代码< iFDE窗口中用内联函数替换宏。