C中的宏用0替换0

时间:2014-06-01 15:39:27

标签: c++ c macros

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

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

然后初始化我的数组:

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

在单独的文件中定义NRDIRECTINPUTS。现在我在'做' ,期待'`'之前得到错误预期的主要表达式。之前' 期待'}'在输入结束时。由于我之前从未使用过宏,所以我首先不确定这是不可能的。

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

3 个答案:

答案 0 :(得分:6)

为什么在使用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 ++开始,它变得更好了:

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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