【问题标题】:Configuring C99 for eclipse for posix为 posix 的 Eclipse 配置 C99
【发布时间】:2016-01-23 05:37:39
【问题描述】:

我正在练习信号,我已经在 ubuntu 上从 gcc 转移到 eclipse,我遇到了一些问题。下面的 gcc 代码对于 eclipse 编译得很好我得到了错误 “错误:从类型‘void (*)(int)’分配给类型‘union’时类型不兼容”

在网上看,由于编译器使用的是 C99 之前的版本,我发现有可能出错。所以我尝试让eclipse编译为C99版本,我发现下面的链接How do you configure GCC in Eclipse to use C99?

我尝试按照 SO 链接中的建议进行更改,但目前我的其他标志有一行显示 " -c -fmessage-length =0 "

如果我在该行之前或之后按照帖子的建议添加 -std=c99,编译器将无法找到文件本身

我假设我收到错误是因为编译器使用的是 C99 之前的版本。如果我在错误的方向上追逐,请纠正我,如果正确,将 -std=c99 添加到标志选项以使 eclipse 使用 C99 的正确方法是什么

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

gcc -O0 -g3 -Wall -c -fmessage-length=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

n

#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;
}

【问题讨论】:

  • 发布的代码丢失#include &lt;unistd.h&gt;
  • 关于这一行:stdbuf(stdout, NULL); 我怀疑你真的想使用setbuf()
  • 这一行:sa.sigaction_handler = sighandler; 应该写成:`sa.sa_handler = sighandler;
  • 在添加缺少的头文件后,按照上面的注释更正行,然后在 eclipse 中编译,使用 `gcc -O0 -g3 -pedantic -Wall -Wextra -Wconversion -c -fmessage-length=0 - std=c99 -MMD -MP"
  • 在阅读sigaction() 的手册页时,您将看到:sigaction(): _POSIX_C_SOURCE &gt;= 1 || _XOPEN_SOURCE || _POSIX_SOURCE 这意味着(至少)必须定义三个项目中的一个,否则头文件将跳过该行( s) sigaction() 函数的原型。 (一般情况下,使用参数-std=gnu99或将#define appropriateName=value作为源文件的第一行会导致sigaction()函数被原型化。(我通常可以使用:#define _GNU_SOURCE导致头文件( s)生产一切)`

标签: c eclipse gcc


【解决方案1】:

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

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

这可能需要为每个项目完成

【讨论】:

  • 抱歉回复晚了 - 我可以通过更改 //sa.__sigaction_handler = sighandler; 来编译而不会添加 -std=c99到 sa.sa_handler = sighandler;按照建议。我总是在 gcc 上写 sa.sa_handler = sighandler,但在输入 sa 后在 eclipse 上写。成员函数的选项只显示 __sigaction_handler 所以我去了。所以这让它编译
  • - 关于建议的步骤,是的,我已经尝试过了,正如我在帖子中指出的那样,当我输入其他标志时它不会编译
  • 发生这种情况是因为您使用的是非 C99 函数和类型 - 您使用的是 posix。您可以使用 -std=gnu99 而不是 -std=c99 这将使您可以访问包括 posix 在内的所有 GNU 扩展,或者添加 #define _POSIX_C_SOURCE=200809L
  • @nos - yes -std=gnu99 选项有效..感谢您解决问题的答案!
  • @user3629249 - 您可以编辑您的答案以包含“nos”为 posix 兼容代码建议的参数。我会继续接受答案,以便其他人也可以受益
猜你喜欢
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多