【问题标题】:Cannot return bool from function无法从函数返回布尔值
【发布时间】:2012-02-03 19:50:29
【问题描述】:

这是base C中的一段代码:

static bool is_ascii_value_of_digit(char ascii_value){

    if((ascii_value<40)&&(ascii_value >= 30)){
        return true;
    }
    return false;
}

avr studio gcc 编译器给我错误:

../calculator.h:4: 错误:在 'is_ascii_value_of_digit' 之前需要 '='、','、';'、'asm' 或 '__attribute__'

类似的错误在其他函数中也很明显。我不知道为什么会这样。花了一个小时弄清楚原因,最后放弃了。据我在网上看到,我的语法不是问题。可能是我忽略的东西。

问题已解决!

非常感谢您的快速帮助,因为它为我节省了很多时间。我假设 bool 是 c 中的关键字。

【问题讨论】:

  • bool 不是关键字,除非您使用 C99。尝试将 bool 替换为 int 并分别返回 1/0。
  • @Yuushi:bool 在 C99 中(或在 C11 中)也不是关键字。如果你没有#include &lt;stdbool.h&gt;,它是未定义的,如果你有,它是一个扩展为_Bool 的宏,它一个关键字。

标签: c function boolean


【解决方案1】:

您可能刚刚忘记#include &lt;stdbool.h&gt;

但是,您的函数的名称和行为不匹配,

if((ascii_value<40)&&(ascii_value >= 30))

十进制数字0-9占据ASCII表中的48-57位,即十六进制0x30-0x39,所以要匹配名称,你应该测试

if (ascii_value < 0x3A && ascii_value >= 0x30)

【讨论】:

  • 或者只是return isdigit(ascii_value) :)
  • 是的 :D 但我觉得自己动手才是重点。
  • 更清晰:if (ascii_value &gt;= '0' &amp;&amp; ascii_value &lt;= '9')(假设您尝试在没有isdigit() 的情况下执行此操作)。
  • @tomlogic:这不仅更清晰,而且更便携(在 EBCDIC 中,'0 .. '9'0xF0 .. 0xF9。(C 确实保证这些值是连续的) ,保证它不适用于字母。)
【解决方案2】:

C 没有bool 类型,也没有truefalse。请改用 int0/1 值。

【讨论】:

  • 自 1999 年以来一直如此,您只需要 &lt;stdbool.h&gt;
【解决方案3】:

如果您的编译器至少部分支持 C99 标准(或 C11,但目前还不太可能),请添加

#include <stdbool.h>

到源文件的顶部,使 boolfalsetrue 可见。

如果不支持(微软对 C99 的支持不好),解决方法是:

typedef enum { false, true } bool;

这与 C99 的 bool(实际上是 _Bool)类型的语义非常不匹配,但它可能已经足够接近了。

顺便说一句,您的函数中不需要 if/else 语句:

static bool is_ascii_value_of_digit(char ascii_value) {
    return ascii_value >= '0' && ascii_value <= '9';
}

bool 值是,它们可以像任何其他值一样被存储和从函数返回。

另一个准则:不要将布尔值与truefalse 进行比较,直接测试它们。在一个条件中(例如在if 语句中),任何非零值都被认为是真的,所以:

if (cond == true) ...

如果cond 具有非零值而不是 1,则可能会失败。只需编写:

if (cond) ...

或者,测试它是否为假:

if (!cond) ...

推荐阅读:comp.lang.c FAQ的第9节。 (进一步推荐阅读:所有其余部分。)

【讨论】:

    【解决方案4】:

    根据http://computer.howstuffworks.com/c11.htm 很多年前就用过

    #define True  1
    #define False 0
    typedef int boolean;
    
    void main(void)
    {
        boolean b;
    
        b=False;
        if(!b) printf("false");
    
    }
    

    在键盘输出为假

    http://codepad.org/iWKiFHFA

    【讨论】:

    • void main() 错误;它应该是int main(void)b==False 最好写成!b。阅读comp.lang.c FAQ 的第 9 节。
    • 我不会说这是“错误的”,它只是大多数时候不是您想要的。有时您必须将 main 类型设为 void,例如许多嵌入式系统的编译器都需要它。
    • @Demizey:许多嵌入式系统的编译器和库不符合标准,在 ANSI C 的上下文中它们是错误的。
    • @oscode:错误。在托管实现中,您需要返回一个值,但在嵌入式环境中非常常见的独立实现没有这样的要求,void main() 就可以了。
    猜你喜欢
    • 1970-01-01
    • 2013-03-11
    • 2017-06-07
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    相关资源
    最近更新 更多