2016-07-22 4 views
3

По какой-то причине я не могу объяснить, компилятор выводит ошибку, заявляя, что обнаружил неожиданный токен #else.Неожиданный #else

Это происходит в начале файла:

#if defined(_USING_MFC) 
    #include "stdafx.h" 
#else 
    #include <windows.h> 
#endif 

Там нет ничего до этого peice кода ожидать несколько (однострочные) комментарии.

Эта ошибка возникает в .cpp-файле. То, что вы видите выше, - это начало файла. Перед этим ничего нет.

Я попытался добавить следующий код перед кодом, определенной выше, и ошибка теперь неожиданно #endif

#if 1 
    #include "stdafx.h" 
#endif 

Так что я подозреваю, что есть проблема с включенным stdafx.h файл, который содержит следующие код:

#ifndef STDAFX_H_INCLUDED 
#define STDAFX_H_INCLUDED 

#include <Afx.h> 
#include <Windows.h> 

using namespace ATL; 

#endif // STDAFX_H_INCLUDED 

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

Вот определения проекта препроцессора:

_DEBUG 
_WIN32_WCE=$(CEVER) 
UNDER_CE 
WINCE 
DEBUG 
_WINDOWS 
$(ARCHFAM) 
$(_ARCHFAM_) 
_UNICODE 
UNICODE 
_TERMINAL_FALCONX3_CE6 
_NO_CPP_EXCEPTIONS 
_DONT_INCLUDE_WS_HEADERS 
_USING_MFC 

и некоторые дополнительные сведения: Компиляция для Windows CE 6 с помощью Visual Studio 2008.

Что бы быть причиной этого? Спасибо.

+1

Упрощенный для противодействия. Люди слишком легко бросают вниз по головам, на мой взгляд, совершенно разумно. – Smeeheey

+0

Это не необоснованно, кажется, что ему не хватает деталей. Я не думаю, что можно выяснить проблему с предоставленной информацией. Но, возможно, я ошибаюсь, поэтому позвольте мне прочитать ответ. –

ответ

9

Основываясь на имени stdafx, я предполагаю, что это предварительно скомпилированный заголовок.

Заголовок precompiler должен быть первым директивой include (preprocessor) в файле, вы не можете поставить что-либо (даже не ifdef) перед ним. Единственное исключение - это несколько строк комментариев, так как в любом случае они игнорируются.

На основании вашего примера, вы должны положить #ifdef _USING_MFC в свой stdafx.h и включить там Afx.h.

+0

Объяснение, что происходит: все, что было до '#include" stdafx.h ", заменяется содержимым предварительно скомпилированного' stdafx.pch'. Это также заменяет '# if', но не' # else', поэтому первая не прекомпилированная строка действительно '# else'. Это, конечно, неожиданно. – MSalters