如何使用C11语言方言在Xcode C文件中编译?

时间:2016-10-27 08:50:27

标签: xcode llvm libc c11

我想编译这个源代码:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, const char *argv[]) {
While:

  printf("MacBook-Pro-...:~ ...$ ");

  char command[128];
  gets_s(command); 

  if (strncmp(command, "exit", 4) == 0)
    exit(0);

  pid_t return_value = fork();

  if (return_value == 0) { 
    int outfile;
    if ((outfile = dup(1)) == -1) 
      return -1;

    close(1); 

    if ((outfile = open("/Users/.../1.txt",
                        O_WRONLY | O_TRUNC | O_CREAT, 0644)) >= 0) {
      execl("/bin/sh", "sh", "-c", command, NULL);
    }

    close(outfile);
    exit(0);
  } else { 
    wait();


    FILE *fp;
    char str[128];
    fp = fopen("/Users/.../1.txt", "r");

    while(!feof(fp)) {
      if(fgets(str, 126, fp))
        printf("%s", str);
    }

    fclose(fp);
    goto While;
  }

  return 0;
}

但我有一些错误: 语义问题

  • 函数'gets_s'的隐式声明在C99中无效
  • 使用'void(int)属性((noreturn))
  • 类型隐式声明库函数'exit'
  • C99
  • 中函数'wait'的隐式声明无效
  • 函数调用的参数太少,预期为1,有0

Project settings:

系统:

产品名称:Mac OS X. 产品版本:10.12.1 BuildVersion:16B2555

Xcode Version 8.0(8A218a)

Apple LLVM 8.0.0版(clang-800.0.38) 目标:x86_64-apple-darwin16.1.0 线程模型:posix

1 个答案:

答案 0 :(得分:0)

几乎没有问题:

  1. Xcode没有看到函数定义,这就是为什么它说“隐含的函数声明'foobar'在C99中无效”。尽管Xcode尝试编译代码,假设在链接阶段将解析未知函数。对于exitwait,它会起作用,但要取消警告,您只需要包含stdlib:#include <stdlib.h>。 从gets_s开始,您需要做一些额外的操作才能使其发挥作用(我不知道它来自哪里)。

  2. 第二个问题是wait函数的签名如下所示:int wait(int *),而您没有给它任何参数。如果您不需要从子进程返回退出代码,只需添加0NULL