C中的宏将0替换为1

Macro in C to replace a 0 with 1

本文关键字:替换      更新时间:2023-10-16

在我的程序中有两个定义,它们给出了数组的大小。现在,你不能初始化大小为0的数组。所以我需要一种方法来检验这个值如果它是0,就输入1。我以前从未使用过任何宏,但这是我想到的:

#define MINIMUMONE(i)  do{if(i == 0){return 1;}else{return i;}}while(0)

,然后像这样初始化数组:

int directIn[MINIMUMONE(NRDIRECTINPUTS)] = {0};

NRDIRECTINPUTS定义在一个单独的文件中。现在我得到了错误预期的主表达式在'do'之前,预期的' "在'do'预期的'}'在输入的末尾。因为我以前从未使用过宏,我甚至不确定这是可能的。

现在,在输入这个问题时,我发现这完全不是宏的工作方式,而是他们简单地用它后面的东西替换了他的定义。有没有办法让我如愿以偿?我正在使用Arduino,所以它是C/c++,以防这可能有帮助。

当您可以使用constexpr -函数时,为什么要使用宏?

constexpr std::size_t minimumone( std::size_t i )
{
    return i == 0? 1 : i;
}

考虑到注释者的需要,这里是上述代码的无分支版本:

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

当然还有模板版本:

template< std::size_t N >
constexpr std::size_t minimumone()
{
    return N == 0? 1 : N;
}

从c++ 1y开始,它变得更好了:

template< std::size_t N >
std::size_t minimumone = (N == 0? 1 : N);

#define MINIMUMONE(i) ( (i) ? (i) : 1 )

这是一个没有条件的版本:

#define MINIMUMONE(i) ((i) + !(i))