Как отключить заголовок "curses.h" (часть "stdio.h в Xcode 6.3 OSX Yosemite), чтобы избежать конфликтующих объявлений функций

Я пытаюсь построить проект в XCode, но я получаю ошибки Implicit declaration of function 'clear' is invalid in C99 а также Conflicting 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'

Почему я получаю эти ошибки и предупреждения? Я пытался найти решение на Stackru, но все связанные ответы были о том случае, когда не было #include какой-то

"ясно" не является ключевым словом в C, так что это не тот случай, не так ли?
(источник: http://aboutc.weebly.com/keywords.html)

Связанные темы (не отвечайте на мой вопрос, хотя они на самом деле связаны):

Спасибо за любую помощь.


ОБНОВИТЬ!

Оказывается, что изменение названия clear намерение к cleark Функция решила проблему. Тем не менее это пока не имеет никакого смысла для меня.


ОБНОВЛЕНИЕ 2!

Я основал свой проект на command line tool шаблон из Xcode 6.3 на OS 10.10. Из-за этого Xcode автоматически добавил некоторые библиотеки и флаги в компилятор проекта. Самое главное, что curses.h заголовок был добавлен, и этот заголовок уже содержит 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! Согласно тому, что Пол Гриффитс обнаружил и опубликовал в комментарии ниже, проблема заключается в следующем:

Я действительно могу повторить эту проблему с Xcode 6.3.1 только с представленным кодом. По какой-то причине stdio.h, кажется, включает curses.h (то есть, если вы не включите stdio.h, эта проблема исчезнет), и я не смог быстро найти способ, чтобы остановить это. Это кажется проблематичным, поскольку стандартные заголовки не должны импортировать случайные символы в глобальное пространство имен без простого и очевидного способа его отключения.

2 ответа

Решение

Обычно я запускаю препроцессор C, чтобы посмотреть, что на самом деле анализирует компилятор. Однако, следуя выводу препроцессора XCode для проверки вывода препроцессора с помощью 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, В модуле "Дарвин" лежит проблема.

Фактически, если я отключаю модули (используя подсказку в " Включить модули Clang", "Отключить автоматическое связывание"), проблема сборки исчезнет. Это

  • в настройках сборки
  • раздел Apple LLVM 6.1 - Язык - Модули
  • настройка включения модулей (C и Objective-C)

В качестве дополнительного указания на проблему, слегка изменив пример (поместив прототип перед включением), я вижу сообщение с жалобой на перегрузку, но это не C.

Возможно, Apple исправит это в следующем выпуске.

Вы включаете "trie.h", а не "tree.h".

Но, может быть, вы просто небрежны при публикации кода...

Могу поспорить, что есть еще одна функция с именем clear (), определенная где-то. Возможно, в вашей версии stdio.h.

Другие вопросы по тегам