如何禁用 "curses.h" header(Xcode 6.3 OSX Yosemite 中“stdio.h 的一部分)以避免函数声明冲突

How to disable "curses.h" header (a part of "stdio.h in Xcode 6.3 OSX Yosemite) to avoid conflicting function declarations

我正在尝试在 Xcode 中构建项目,但出现以下错误 Implicit declaration of function 'clear' is invalid in C99Conflicting types for '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'

为什么我会收到这些错误和警告?我试图在 Whosebug 上搜索解决方案,但所有相关答案都是关于没有某种 #include 的情况。

'clear' 不是 C 中的关键字,所以不是这样,对吗?
(来源:http://aboutc.weebly.com/keywords.html

相关话题(其实有关系但不要回答我的问题):

感谢您的帮助。


更新!

事实证明,将 clear 函数的名称更改为 cleark 函数可以解决问题。尽管如此,它对我来说还没有任何意义。


更新 2!

我的项目基于 Xcode 6.3 和 Mac OS 10.10 的 command line tool 模板。因此 Xcode 已自动将一些库和标志添加到项目的编译器中。这里最重要的是添加了 curses.h header 并且这个 header 已经 包含 clear() 功能 .

这是 Conflicting types for 'clear' 错误日志: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/curses.h:541:28: Previous declaration is here

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


更新 3! 根据 Paul Griffiths 在下面的评论中发现和发表的内容,问题如下:

I can indeed replicate this problem with Xcode 6.3.1 with only the code presented. For some reason, stdio.h seems to be including curses.h (i.e. if you don't include stdio.h, this issue goes away), and I haven't been quickly able to find a way to stop it doing that. This seems to be problematic, since standard headers should not import random symbols into the global namespace without an easy and obvious way to turn it off.

您包括 "trie.h",而不是 "tree.h"。

但也许这只是你在发布代码时不小心...

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

通常我 运行 C 预处理器查看编译器实际解析的内容。但是,按照 Xcode Preprocessor Output 使用 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");
}

显然问题是 Xcode 对模块的使用 而不是 而不是 stdio.h 包括 curses.h。 "Darwin"模块就是问题所在。

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

  • 在构建设置中
  • 部分 Apple LLVM 6.1 - 语言 - 模块
  • 设置启用模块(C 和 Objective-C)

作为对问题的进一步提示,稍微重新安排了示例(将原型放在包含之前),我看到一条消息抱怨 重载 — 但这不是 C .

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