我的程序中有几个定义为数组提供大小。现在,你不能初始化一个大小为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 ++,以防这可能会有所帮助。
答案 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))