2016-12-28 16 views
1

У меня есть проект в CodeBlocks (Mingw32), который настроен так:Почему ошибки, сообщаемые внутри стандартного заголовка библиотеки, после добавления каталога поиска в параметры компилятора?

Foo/src/somefile1.cpp 
Foo/src/somefile2.cpp 
Foo/src/somefile1.h 
... 

Заголовки включены таким образом:

#include "somefile1.h" 

Для того, чтобы иметь возможность компилировать я добавил следующий каталог в разделе «опции проекта»> «Поиск каталогов» (как относительный путь):

src 

После добавления этой папки, проект компилируется. Однако, если я включаю стандартный заголовок как <ctime> следующие ошибки появляются в CTIME заголовочном файле:

'::clock_t' has not been declared 
'::time_t' has not been declared 
... 

и так далее для всех линий внутри std namespace скобок CTime. Если я удалю папку src из поисковых каталогов, я могу скомпилировать ее снова.

Я сократил код до минимума, удалены все файлы, кроме main.cpp, но проблема все еще существует:

#include <ctime> //errors if "src" folder added in search folders 

int main(int argc, char **argv) { 
    time(NULL); //does not compile 
    return(0); 
} 
+0

Вы пытались использовать 'std :: time_t'instead of' :: time_t'? – SebNag

+0

Вы хотите изменить файл заголовка ctime напрямую? Вот как выглядит ctime: https://gcc.gnu.org/onlinedocs/gcc-6.2.0/libstdc++/api/a01181_source.html Все ошибки появляются внутри строк пространства пространств std – tigrou

+1

Ни при каких обстоятельствах не изменяйте заголовок стандартной библиотеки файлы. –

ответ

1

Я нашел проблему:

В проекте я пытаюсь скомпилировать есть файл с именем «время. час".

Он имеет то же имя, что и в стандартной библиотеке time.h. Из-за этого внутри ctime-файла включается time.h проекта (который не содержит clock_t и другие определения), и поэтому ctime не может быть скомпилирован.

В качестве решения я просто переименовал time.h проекта в незарегистрированное имя.

+0

Похоже, что поведение [gcc's search] (https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html) на '#include <>' s и '#include" "' здесь, то: Каталоги, добавленные в путь поиска с помощью '-I', будут искать оба, а в случае' <> ' перед любым другим вариантом, если не используется устаревшая опция -I-'. Опция '-iquote' добавит каталог только в путь поиска для цитируемых включений. Начиная с '' '#include <>' '' time.h', опция '-I' переопределит местоположение' time.h', если указанный каталог содержит файл 'time.h'. – jaggedSpire

0

Заголовок <ctime> помещает имена в std имен, так что вы хотите:

std::time(NULL); 

У вас, вероятно, есть using namespace std; в одном из ваших собственных файлов заголовков - не делайте этого.

Кроме того, вы обычно хотите включить свои собственные заголовки, как это:

#include "somefile1.h" 
+0

Добавление 'std ::' не решает проблему, в заголовке 'ctime' все еще есть ошибки. 'using namespace std;' => У меня его нет, проблема возникает даже при минимальном примере, представленном в OP. Заголовок. Я использую двойные кавычки, я сделал ошибку, набрав вопрос на SO. – tigrou

+0

Вот скриншот: http://i.imgur.com/3AfDosq.jpg – tigrou

+1

@jagged Снимок экрана представляет собой стандартный заголовок библиотеки, который помещает имена библиотек в пространство имен std - это правильно. –