C中的宏用0替换0

jde*_*ere 0 c c++ macros

我的程序中有几个定义为数组提供大小.现在,你不能初始化一个大小为0的数组.所以我需要一种方法来检查这个值,如果它是零,则放1.我以前从未使用任何宏,但这是我提出的:

#define MINIMUMONE(i)  do{if(i == 0){return 1;}else{return i;}}while(0)
Run Code Online (Sandbox Code Playgroud)

然后像这样初始化我的数组:

int directIn[MINIMUMONE(NRDIRECTINPUTS)] = {0};
Run Code Online (Sandbox Code Playgroud)

与NRDIRECTINPUTS在单独的文件中定义.现在,我得到了错误之前,"做"预期的主要表现,之前"做"预期"`"和在输入预计年底"}".由于我之前从未使用过宏,所以我首先不确定这是否可行.

现在,在输入这​​个问题的时候,我得知的是,这完全不是宏的工作方式,而是简单地用它后面的内容取代了他的定义.有办法做我想做的事吗?我正在使用Arduino,所以它是C/C++,以防这可能有用.

Col*_*mbo 6

为什么在使用constexpr-functions 时使用宏?

constexpr std::size_t minimumone( std::size_t i )
{
    return i == 0? 1 : i;
}
Run Code Online (Sandbox Code Playgroud)

为了评论员的缘故,这里是上面代码的无分支版本:

constexpr std::size_t minimumone( std::size_t i )
{
    return i + (i == 0); // Becomes at least 1 whatever value i has.
}
Run Code Online (Sandbox Code Playgroud)

当然还有模板版本:

template< std::size_t N >
constexpr std::size_t minimumone()
{
    return N == 0? 1 : N;
}
Run Code Online (Sandbox Code Playgroud)

从C++开始,它变得更好:

template< std::size_t N >
std::size_t minimumone = (N == 0? 1 : N);
Run Code Online (Sandbox Code Playgroud)

  • 很遗憾`std :: max`不是'constexpr`. (2认同)
  • 它完美无缺!`constexpr`-函数只是可以在常量表达式中使用的函数,例如数组的边界.它们是为此目的而创建的,它们非常适合这里.不要使用宏,你在这里忽略了一个非常有用的功能. (2认同)