这是编译器中的错误还是C通常如何工作?

时间:2015-04-19 16:20:43

标签: c

我正在使用针对8位微控制器的XC8编译器。

这不会产生任何警告或错误,但无论如何都会挂起微控制器:

    uint8_t some_array[4];
    uint8_t        // no compile errors at all
    some_function();

我注意到的另一件事是,期望这个不会使微控制器崩溃,并且似乎返回0:

printf("%c", some_function); 

在这一个中,我正在调用一个永远不会返回0的函数。我忘记添加()但它编译并以某种方式运行,但返回值错误。

2 个答案:

答案 0 :(得分:1)

见这里:Why is using the function name as a function pointer equivalent to applying the address-of operator to the function name?

函数的名称只是它的地址。(在这一点上,C和C ++是相同的)。就像数组的名称是它的起始地址一样。

&用于获取变量的地址,但函数名称已经是地址。所以我们不需要'&'这里。

答案 1 :(得分:0)

编译器会忽略不可打印的字符(例如空格,换行符和制表符),因此第一个示例不会产生编译错误,虽然不会产生运行时错误,因此崩溃的原因是其他原因。

在第二个示例中,大括号缺失必须产生编译错误。如果没有,则是编译器问题。