StdAfx + Заголовочный файл - Порядок включения в приложение MFC

Я использую Visual Studio 2005. Я создал консольное приложение на основе MFC под названием «StdAfx зависимость». IDE создала для меня следующие файлы.

  1. Resource.h
  2. StdAfx Dependancy.h
  3. stdafx.h
  4. StdAfx Dependancy.cpp
  5. stdafx.cpp

Я добавил еще один класс CHelper с Helper.h и Helper.cpp, как показано ниже.

Helper.h:

#pragma once

class CHelper
{
public:
    CHelper(void);
    ~CHelper(void);
};

Helper.cpp

#include "StdAfx.h"
#include "Helper.h"

CHelper::CHelper(void)
{
}

CHelper::~CHelper(void)
{
}

Я создал объект для CHelper в основной функции; для этого я добавил файл Header.h в первую строку StdAfx Dependancy.cpp, как показано ниже; и я получил следующие ошибки.

d: \ коды \ зависимость stdafx \ зависимость stdafx \ stdafx зависимость.cpp (33): ошибка C2065: 'CHelper': необъявленный идентификатор
d: \ коды \ зависимость stdafx \ зависимость stdafx \ stdafx зависимость.cpp (33): ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором 'myHelper'
d: \ codes \ stdafx зависимостью \ stdafx зависимостью \ stdafx зависимостью.cpp (33): ошибка C2065: 'myHelper': необъявленный идентификатор

Но когда я включаю его после stdafx.h, ошибка пропадает. Почему?

// Stdafx dependancy.cpp : Defines the entry point for the console application.
//

#include "Helper.h"

#include "stdafx.h"
#include "Stdafx dependancy.h"

// #include "Helper.h" --> If I include it here, there is no compilation error

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// The one and only application object

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // initialize MFC and print and error on failure
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: change error code to suit your needs
        _tprintf(_T("Fatal Error: MFC initialization failed\n"));
        nRetCode = 1;
    }
    else
    {
        CHelper myHelper;
    }

    return nRetCode;
}

person bdhar    schedule 22.06.2010    source источник


Ответы (2)


Эта ссылка должна дать вам ключ к разгадке. Назначение stdafx.h

Строки, определенные перед #include "stdafx.h", игнорируются компилятором. Поэтому, если вы действительно хотите включить эти файлы, вам нужно включить их после #include "stdafx.h".

Надеюсь, это понятно.

person ckv    schedule 22.06.2010

В дополнение к ответу ckv не имеет смысла включать файлы заголовков перед "stdafx.h", поскольку любой нетривиальный файл заголовка будет содержать типы фреймворков, которые включены в него (например, любые типы MFC).

person Igor Zevaka    schedule 22.06.2010