“如何禁用”;诅咒;标头(Xcode 6.3 OSX Yosemite中“stdio.h”的一部分)以避免函数声明冲突

“如何禁用”;诅咒;标头(Xcode 6.3 OSX Yosemite中“stdio.h”的一部分)以避免函数声明冲突,c,macos,curses,compiler-flags,xcode6.3,C,Macos,Curses,Compiler Flags,Xcode6.3,我试图在Xcode中构建一个项目,但我得到以下错误函数“clear”的隐式声明在C99中无效并且与“clear”的冲突类型 代码如下: //main.c #include <stdio.h> #include "tree.h" int main(){ clear(); // Implicit declaration of function 'clear' is invalid in C99 return 0; } //tree.c #include <stdio.h

我试图在Xcode中构建一个项目,但我得到以下错误
函数“clear”的隐式声明在C99中无效
并且
与“clear”的冲突类型

代码如下:

//main.c
#include <stdio.h>
#include "tree.h"

int main(){
  clear(); // Implicit declaration of function 'clear' is invalid in C99
  return 0;
}

//tree.c
#include <stdio.h>
#include "tree.h"
void clear(){ ///Conflicting types for 'clear'
  printf("Command clear.\n");
}

//tree.h
#include <stdio.h>

void clear(); ///Conflicting types for 'clear'
//main.c
#包括
#包括“tree.h”
int main(){
clear();//函数“clear”的隐式声明在C99中无效
返回0;
}
//树
#包括
#包括“tree.h”
void clear(){//“clear”的冲突类型
printf(“命令清除。\n”);
}
//树
#包括
无效清除()///“清除”的冲突类型
为什么我会收到这些错误和警告?我试图寻找StackOverflow的解决方案,但是所有关于没有
#的案例的相关答案都包括某种类型的

“clear”在C中不是一个关键字,所以不是这样,是吗
(来源:)

相关主题(尽管它们实际上是相关的,但不要回答我的问题):

谢谢你的帮助


更新

事实证明,将
clear
funtcion的名称更改为
cleark
函数解决了这个问题。然而,这对我来说还没有任何意义


更新2

我的项目基于Mac OS 10.10上Xcode 6.3的
命令行工具
模板。正因为如此,Xcode自动向项目的编译器添加了一些库和标志。这里最重要的是添加了
curses.h
头,并且该头已经包含
clear()
函数

以下是“清除”的
冲突类型
错误日志:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/curses.h:541:28:前面的声明在这里

我试图手动从编译器的标志中删除
-lcurses
,但找不到这样的设置。有没有其他方法来建立这个项目?(总而言之,我的目标是能够在项目扩展时使用Xcode的调试器)


更新3! 根据保罗·格里菲斯(Paul Griffiths)在以下评论中发现并发表的内容,问题如下:


我确实可以用Xcode 6.3.1复制这个问题,只需提供代码。出于某种原因,stdio.h似乎包含了curses.h(也就是说,如果你不包含stdio.h,这个问题就会消失),我还没有很快找到阻止它这样做的方法。这似乎是有问题的,因为如果没有一种简单而明显的关闭方法,标准头不应该将随机符号导入全局名称空间

您包括的是“trie.h”,而不是“tree.h”

但也许那只是你在发布代码时太粗心了


我打赌在某处定义了另一个名为clear()的函数。可能在你的stdio.h版本中

通常我运行C预处理器来查看编译器实际解析的内容。但是,使用Xcode检查预处理器输出的后续步骤并不能实现这一点-它将
#include
转换为
@import
。以下是“预处理器”视图显示的内容:

// Preprocessed output for tree.c
// Generated at 9:24:57 PM on Friday, May 1, 2015
// Using Debug configuration, x86_64 architecture for curses-vs-stdio target of curses-vs-stdio project

# 1 "/Users/thomas/Desktop/curses-vs-stdio/curses-vs-stdio/tree.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 322 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "/Users/thomas/Desktop/curses-vs-stdio/curses-vs-stdio/tree.c" 2



# 1 "/Users/thomas/Desktop/curses-vs-stdio/curses-vs-stdio/tree.h" 1


void clear(void);

@import Darwin.C.stdio; /* clang -E: implicit import for "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/stdio.h" */
# 5 "/Users/thomas/Desktop/curses-vs-stdio/curses-vs-stdio/tree.c" 2

void clear(void) {
    printf("Command clear.\n");
}
//tree.c的预处理输出
//2015年5月1日星期五晚上9:24:57生成
//使用调试配置,针对curses vs stdio项目的curses vs stdio目标的x86_64体系结构
#1“/Users/thomas/Desktop/curses vs stdio/curses vs stdio/tree.c”
# 1 "" 1
# 1 "" 3
# 322 "" 3
# 1 "" 1
# 1 "" 2
#1“/Users/thomas/Desktop/curses vs stdio/curses vs stdio/tree.c”2
#1“/Users/thomas/Desktop/curses vs stdio/curses vs stdio/tree.h”1
无效清除(无效);
@导入Darwin.C.stdio;/*clang-E:Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/stdio.h的隐式导入*/
#5“/Users/thomas/Desktop/curses vs stdio/curses vs stdio/tree.c”2
无效清除(无效){
printf(“命令清除。\n”);
}
显然,问题在于Xcode使用的是模块,而不是
stdio.h
,包括
curses.h
。“达尔文”模块就是问题所在

事实上,如果我禁用模块(使用中的提示),构建问题就会消失。这是

  • 内置设置
  • 第Apple LLVM 6.1节-语言-模块
  • 设置启用模块(C和Objective-C)
作为问题的进一步提示,稍微重新安排了示例(将原型放在include之前),我看到一条消息,抱怨重载,但这不是C


也许苹果会在下一个版本中解决这个问题。

关键是没有多少东西可以展示-如果有必要,我可以发布整个代码,但它并不复杂(只是一堆尚未实现的函数,如
add()
clear()
。令人惊讶的是只有
clear()
函数抛出错误和警告..注意:有趣的“将
clear
函数的名称更改为
cleark
函数”.
funtcion
-->
function
您发布的代码不会导致您显示的问题。您必须更具体地说明您的include。或者,您可以选择另一个函数名并使用它。问题是,如果您最终使用标准
gcc
编译它,则不会导致问题但是,当我试图在Xcode中加载命令行工具模板编译它时,它确实会导致问题。我确实可以用Xcode 6.3.1复制这个问题,只需提供代码。出于某种原因,
stdio.h
似乎包括
curses.h
(也就是说,如果您没有包含
stdio.h
,这个问题就会消失),我还没有找到一种方法来阻止它这样做。这似乎是有问题的,因为标准标题不应该导入rando