在c宏中使用if else

时间:2017-09-17 16:04:54

标签: c macros

我正在尝试定义以下宏:

#define UTF8_2B(c) if((0xc0 & c) == 0xc0){return 1;}

但我遇到了错误:

expected expression before ‘if’

宏的调用如下:

int i = UTF8_2B(c);

其中c是从文件中读取的unsigned char。

为什么会这样?你能否在宏中使用if else语句? 另外,我已经读过在你的宏中使用分号不是一个好主意,但我不明白为什么。 我是c的新手,所以答案越彻底越好。

3 个答案:

答案 0 :(得分:4)

C(和C ++)预处理器宏基本上是“复制 - 粘贴”,带有参数替换。所以你的代码变成了:

{{1}}

这是无效的语法。

答案 1 :(得分:2)

您将宏的结果分配给变量。您无法使用当前宏(return从当前函数返回,并且不返回要分配给i的内容:所以不是您想要的内容。

如果您使用gcc,则可以使用-E命令行查看预处理代码的内容。

所以你可以在宏中使用if,但不能在像函数这样使用的宏中使用c

此外:

  • 如果c是复杂表达式,则运算符优先级可能会使宏生成错误的代码
  • 宏应提供一种需要分号的方法,因此IDE和人类读者将其视为正常功能

我建议用一个简单的测试(如果为真,则产生1,否则为0),符合“需要分号”标准,可以安全地与复杂的#define UTF8_2B(c) ((0xc0 & (c)) == 0xc0) 表达式一起使用:

n <- nrow(dataset)
S1 <- dataset$S1
S1_logret <- log(S1[2:n])-log(S1[1:(n-1)])

答案 2 :(得分:2)

为此目的存在三元运算符。假设你想要1如果是真而0想要假,正确的宏是:

 #define UTF8_2B(c) (((c) & 0xC0) == 0xC0 ? 1 : 0)

现在您可以分配结果了。在宏中使用return将从封闭函数返回,而不是从宏返回,并且几乎总是一个坏主意。