如何解决“无符号'之前的预期表达式”错误?

时间:2011-12-20 22:34:57

标签: c

我的代码是:

#include <unistd.h>  

(void)alarm(unsigned int 0);

error: expected expression before 'unsigned'

但我收到以下错误:

  

错误:'unsigned'之前的预期表达式,原因是:(void)alarm(unsigned int 0);

我不确定这是我的语法还是使用(void)或其他东西。发生了什么事?

我在Windows下使用Code::Blocks

6 个答案:

答案 0 :(得分:4)

呃,这是一个函数调用,还是说它是一个声明?

如果你认为它是一个声明,那么它应该是:

void alarm( unsigned int i );

如果你认为它是一个函数调用,那么它应该是:

(void) alarm( 0 );

(回到我的C ++时代,当我想记录我不关心函数返回的事实时,我曾经将函数结果转换为void。)

编辑:然后再说一次,如果您要做的只是声明一个变量,那么试试这个:

unsigned int alarm = 0;

或者如果您只是想将变量设置为零,那么事情就更简单了:

alarm = 0;

8 - )

答案 1 :(得分:1)

看起来您正在尝试调用POSIX alarm函数,该函数需要unsigned int并返回unsigned int

正确的通话方式是:

alarm(0);

通常不需要将返回值强制转换为void,尽管它可以使某些编译器的警告静音。

通常无需明确将0投射到unsigned int。正确的表格是(unsigned int)0。在必要时使用后缀通常更简单,例如, 0U的类型为unsigned int,但在这种情况下,普通0可以正常使用。

此外,由于函数调用不是声明,因此它必须出现在函数体内。

E.g。

void foo()
{
    alarm(0);
}

答案 2 :(得分:1)

你没有给我们足够的背景来弄清楚你想要做什么。

我将假设您要使用参数0调用alarm函数。根据手册页(键入man alarmman 2 alarm,或关注{{ 3}}),alarm(0)将在不设置新警报的情况下取消任何现有警报。

在我的系统(Ubuntu,一个Linux,即类Unix系统)上,以下编译,链接和执行没有错误:

#include <unistd.h>
int main(void) {
    alarm(0);
    return 0;
}

我将程序保存在名为c.c的文件中,然后使用以下命令对其进行编译和链接:

gcc c.c -o c

并执行:

./c

alarm函数的实现恰好在标准C库中,默认情况下是链接的。你的系统可能会或可能不是这种情况,但如果它是Linux或其他类似Unix的系统,它可能就是。

(这不是一个特别有用的程序,但它可能是有用的东西的起点。

编辑:

我现在看到你正在使用Windows。 alarm()函数由POSIX标准定义,并且(大部分)特定于类Unix系统。 Windows可能默认不提供它。在Windows下运行类似Unix的仿真层,例如this link

但是如果你想在Windows下开发代码,你可以考虑避免Windows没有(直接)支持的非可移植结构。

为什么要拨打alarm()?您是否需要执行特定功能的功能,或者您只是想学习基础知识?

答案 3 :(得分:0)

同意Chiron认为这属于StackOverflow。

  1. 你不需要将回报转换为void只是忽略它,如果你选择但更好但不
  2. 为什么在函数调用中声明变量0?电话应该是:

    (void)alarm(0);

答案 4 :(得分:0)

#include <unistd.h>
int main() {
    alarm(0);
}

我认为问题是编写一个调用alarm标准函数的简单程序。 (参见关于@MikeNakis的问题的评论)。

您不能只将手册页中的代码复制到程序中并进行编译。你必须制作一个完整的程序,就像我在这里给出的程序一样。

答案 5 :(得分:0)

由于您已包含unistd.h,我假设您正在尝试调用该标头中声明的alarm()函数:

unsigned int alarm(unsigned int seconds);

如果要使用0秒的参数调用alarm,只需执行alarm(0)。您无需将0投射到unsigned int,但如果您真的想要,则只需alarm( (unsigned)0 );

如果您不关心返回类型,则只需将其分配给变量即可。您不需要在函数调用的开头添加(void)来忽略返回值。 (void)alarm(0);完全合法,但也毫无意义。

我不确定你的代码片段是一个破碎的示例还是您的实际代码,但您不能只从这样的函数外部调用alarm


另外,从手册页:

  

如果秒为零,则不会安排新的 alarm()

但也许你可能想要取消以前的闹钟:

  

无论如何,以前设置的 alarm() 都会被取消。

编辑:直到几分钟前Keith指出你正在使用Windows时才意识到。 alarm()是* nix函数,如果您想从Windows调用它,可以使用 Cygwin (常用)等工具来模拟* nix环境。