2016-01-23 157 views
0

我正在练习信号,并且我已经从gcc移到eclipse上,并且遇到了一些问题。 “:分配给从类型键入‘联盟’‘无效(*)(INT)’时不兼容类型的错误”为eclipse配置C99 for posix

寻找网上我看到,因为编译器错误的几率低于GCC代码编译罚款月食我得到错误 使用pre C99版本。于是,我就使Eclipse编译C99版,我发现下面的链接How do you configure GCC in Eclipse to use C99?

我试图做出改变,如SO链接建议,但目前我的其他标志具有线,说 “-c -fmessage长度= 0 “

如果我添加-std = C99作为之前或之后行编译器无法找到文件本身

我假设我使用预C99版得到,因为编译器的错误邮寄建议。请纠正我,如果我以错误的方向,如果它的正确我追什么会是-std = C99添加到标志选项,以使Eclipse中使用C99的正确方法

编辑:基于答案时,我改变了sig_handler参数我能够在不添加-std = c99标志的情况下进行编译,但是按照建议,我会遇到编译错误。下面是编译行

GCC -O0 -g3 -Wall -c -fmessage长度= 0 -std = C99 -MMD -MP -MF

`odd_process.d" -MT"odd_process.d" -o "odd_process.o" "../odd_process.c`" 
    ../odd_process.c: In function ‘main’: 
    ../odd_process.c:13:2: error: unknown type name ‘sigset_t’ 
    ../odd_process.c:14:19: error: storage size of ‘sa’ isn’t know 

Ñ

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 

void sighandler(int sig) 
{ 
    printf("signal has been caught \n "); 

} 

int main(void) 
{ 
    sigset_t block_signal, empty_signal; 
    struct sigaction sa; 

    pid_t childid; 
    int i; 

    sigemptyset(&sa.sa_mask); 
    sa.sa_flags = 0; 

    **/*for below line while running on eclipse I see error which says*/ 
    /***error: incompatible types when assigning to type ‘union <anonymous>’ from type ‘void (*)(int)’** */** 

**sa.__sigaction_handler = sighandler;** 

    stdbuf(stdout, NULL); 

    if (sigaction(SIGCHLD, &sa, NULL) == -1) 
    { 
     printf("value not passed to signal handler \n "); 
    } 

    sigemptyset(&block_signal); 
    sigaddset(&block_signal, SIGCHLD); 

    if (sigprocmask(SIG_SETMASK, &block_signal, NULL) == -1) 
    { 
     printf("error occurred while setting signal mask \n"); 
    } 

    childid = fork(); 

    printf("value of child id is -- %d ", childid); 

    switch(childid) 
    { 
     case -1: 
      printf("Error condition child creation did not happen properly \n"); 
      exit(-1); 
     case 0: 
      printf(" Child got created and will print odd number !!! "); 
      sleep(5); 
      exit(1); 
     default: 
      printf(" parent gets created !!! \n "); 
      break; 
    } 

    sigemptyset(&empty_signal); 
    sigsuspend(&empty_signal); 
    printf(" parent will print \n "); 

    for(i = 0; i < 10; i++) 
    { 
     printf("%d ", i); 
    } 

    printf("\n"); 

    return EXIT_SUCCESS; 
} 
+0

张贴代码丢失的#include''关于 – user3629249

+0

这行做:'stdbuf(标准输出,NULL );'我怀疑你真的想用'setbuf()' – user3629249

+0

这一行:'sa.sigaction_handler = sighandler;'应该写成:'sa.sa_handler = sighandler; – user3629249

回答

1

修改CFLAGS,(与所需的项目打开)。

  1. 点击菜单项project
  2. 单击下拉菜单项properties
  3. 单击左侧窗口中的C/C++Build标签 - 扩大
  4. 请单击展开的C/C++Build
  5. Settings选项卡中单击GCC C Comiler选项卡中的第二列 - 扩大
  6. 点击miscellaneous选项卡中第二列选择第三列
  7. 选择“其他flags`线
  8. 进入次è附加的标志,如-std=gnu99
  9. 点击ok

这可能需要为每个项目

+0

对不起,延迟回复 - 我可以通过更改\t //sa.__sigaction_handler = sighandler;而无需添加-std = c99而无错地进行编译sa.sa_handler = sighandler;正如我所建议的,我总是在编写sa时使用gcc编写sa.sa_handler = sighandler,但是在eclipse上编写sa。成员函数的选项只显示了__sigaction_handler,所以我选择了它,这样就可以编译 – oneday

+0

- 关于建议的步骤是的,我已经尝试过它们,正如我在帖子中指出的那样,当我输入附加标志时,它不会编译 – oneday

+1

发生这种情况是因为您使用的是非C99功能s和类型 - 你使用的是posix。你可以使用-std = gnu99而不是-std = c99,它可以让你访问包括posix在内的所有GNU扩展,或者添加#define _POSIX_C_SOURCE = 200809L – nos