2013-06-04 2 views
0

У меня есть проект Qt с использованием предварительно скомпилированных заголовков (не уверен, что это актуально) в VS2012, и он компилируется и отлично работает. Но когда я пытаюсь скомпилировать один и тот же проект в QtCreator, он показывает ошибки. Прежде всего - оба проекта соответствуют друг другу и ранее были правильно настроены (они были скомпилированы и работали просто отлично). Однако после последних изменений в коде что-то пошло не так.«Идентификатор» уже имеет тело, но идентификатор не найден

Ошибка:

pch.h:34: error:C2084: function 'void handleExceptionByShowingMessage(std::exception &)' already has a body 
main.cpp:16: error:C3861: 'handleExceptionByShowingMessage': identifier not found 

Они идут на протяжении более 30 линий с другой функцией, определенной в pch.h (встроенная тоже) и еще нескольких CPP файлов. Но все ошибки аналогичны.

От pch.h:

inline void handleExceptionByShowingMessage(std::exception &e) 
{ 
    QMessageBox msgBox; 
    msgBox.setText(QString::fromUtf16((ushort*)e.what())); 
    msgBox.setStandardButtons(QMessageBox::Discard); 
    msgBox.setIcon(QMessageBox::Warning); 
    int ret = msgBox.exec(); 
} 

Я не вставить вызовы функций из cpp файлов, так как это просто регулярное использование. Все файлы cpp содержат pch.h правильно (первая строка кода), и, как я уже сказал, точно такая же структура кода и файлов работает в VS2012 (чей компилятор, я считаю, QtCreator фактически использует ...).

Если вам нужно больше кода/информации, пожалуйста, дайте мне знать.

Обновление: Да, все заголовки имеют #pragma once. Интересное уведомление, хотя - когда я переместил эти два определения функций в фиктивный заголовочный файл и включил его в pch.h, проект был составлен в порядке.

+1

У вас есть охранник или # прагма один раз в вашем pch.h? – slaphappy

+0

Да, конечно. Также, пожалуйста, ознакомьтесь с обновлением моего вопроса. – NPS

+0

Я подозреваю, что 'pch.h' включается дважды - один раз при загрузке предварительно скомпилированных заголовков, один раз при разборе самого файла, который' #pragma once' не будет защищать agaisnt. – slaphappy

ответ

2

#pragma once только предотвращает включение файла, содержащего директиву, в несколько раз. Предварительно скомпилированный файл заголовка, pch.h, включается при загрузке предварительно скомпилированных заголовков и во второй раз, когда файлы скомпилированы. Директива #pragma рассматривает их как отдельные файлы, поэтому в этом контексте они не будут работать.

Файл pch.h (или stdafx.h) является оптимизацией и в идеале не должен содержать исходный код, а только #includes для других файлов заголовков. Таким образом, в том числе и несколько раз, это не проблема.

Другим решением будет использование защитного ограждения (#ifndef PCH #define PCH #endif), который предотвратит включение файла несколько раз.

1

вы можете попробовать static inline, если код находится в заголовке. Не знаю, почему inline не означает static, но я тоже споткнулся об этом некоторое время назад.

+0

Это не поможет. – NPS

Смежные вопросы