#include игнорируется

So,

У меня есть этот код, который я пытаюсь обновить. Он был написан для Visual Studio 6, и я пытаюсь скомпилировать его в Visual Studio 2010.

В stdafx.h он включает afx.h и afxwin.h и еще несколько вещей, необходимых для работы программы. Примечательно, что CString используется в других файлах заголовков.

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

Однако была ошибка. (CString не распознавался как тип.) Итак, я решил убедиться, что он прошел через все включения. Итак, я помещаю еще одно сообщение #pragma после #include, и это сообщение не печатается.

Означает ли это, что на самом деле он не включен?


person Colin DeClue    schedule 23.06.2010    source источник
comment
CString в VS 6 раз был классом, а впоследствии стал шаблоном. Может с этим что-то связано? Можете ли вы опубликовать точные ошибки компилятора перед соответствующим кодом?   -  person Jorge Ferreira    schedule 23.06.2010
comment
Опубликуйте несколько фрагментов кода.   -  person Hans Passant    schedule 23.06.2010
comment
Опубликовал ответ с моим первоначальным комментарием об изменениях CString в шаблоне после VS 6.   -  person Jorge Ferreira    schedule 23.06.2010


Ответы (3)


Передача моего комментария в ответ.

CString в VS 6 раз был классом, а впоследствии стал шаблоном. Может с этим что-то связано?

Проблема была связана с использованием typedef с CString. Опубликовать VS 6, это невозможно. Я просто изменил ссылки вручную, и теперь он компилируется.

person Jorge Ferreira    schedule 23.06.2010

Ваше объяснение немного сложно понять, но я думаю, что вы сталкиваетесь с различиями между обычной компиляцией и предварительно скомпилированными заголовками.

С предварительно скомпилированными заголовками компилятор нормально обрабатывает первый файл (мастер нового проекта настраивает для этого stdafx.cpp). После обработки включаемого файла (обычно stdafx.h), заданного в параметрах проекта для контроля перед компиляцией, компилятор сохраняет свое состояние в файле .pch.

Для каждого другого файла компилятор просматривает файл без какой-либо обработки, просто ищет включаемый файл. Затем он считывает файл .pch, загружает сохраненное состояние и продолжает синтаксический анализ и компиляцию в обычном режиме.

Одним из следствий такого дизайна является то, что любые строки выше #include "stdafx.h" в stdafx.cpp становятся частью состояния и видны всем другим файлам. А строки выше #include "stdafx.h" в других файлах просто игнорируются.

person Ben Voigt    schedule 23.06.2010
comment
Ударь меня. Я думаю, вы имеете в виду, что вы печатаете сообщение из stdafx.h, и вы не видите это сообщение напечатанным при компиляции файла, включающего stdafx.h: это потому, что он не перекомпилирует stdafx.h снова, это получение сохраненного состояния при компиляции stdafx.cpp. Вы должны увидеть сообщение в файле stdafx.cpp. - person Rup; 23.06.2010
comment
Я понял это, теперь. Это произошло из-за изменений в CString, начиная с VS 6. Спасибо. - person Colin DeClue; 23.06.2010

Проблема была связана с использованием typedef с CString. Опубликовать VS 6, это невозможно. Я просто изменил ссылки вручную, и теперь он компилируется.

person Colin DeClue    schedule 23.06.2010
comment
Отредактируйте свой исходный пост, не публикуйте ответ ... это просто местный этикет :) - person Goz; 23.06.2010