15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


afximpl.h (Was Re: access to AUX)

dhoward@kset.com
Thursday, January 25, 1996

I've actually found it useful to include "afximpl.h" in all my files.  In 
fact, the way that I do it is to include the "stdafx.h" in the SRC 
directory.  The stdafx.h is the standard include file used to compile MFC.  
I always include this file at the very beginning as part of my precompiled 
header.

Why?

The "stdafx.h" in SRC includes every header file in the MFC universe, 
documented or undocumented.  If you include this file, your code will 
compile if it is any way possible in MFC.  All the #define's and #pragma's 
are set up to make MFC work.

The real bonus comes when you use the Visual C++ Cross Platform Edition for 
the Macintosh.  Rather than having the figure out all the new header files 
that you need, the "stdafx.h" includes most all the Macintosh and MFC header 
files that you will ever need.  They all work together (because they had to 
build MFC with it) with all the proper #define's and everything.

That's my recommendation of the week.




Mike Blaszczak -- mikeblas@interserv.com
Saturday, January 27, 1996

[Mini-digest: 2 responses]

On Thu, 25 Jan 1996, dhoward@kset.com wrote:
>I've actually found it useful to include "afximpl.h" in all my files.  In 
>fact, the way that I do it is to include the "stdafx.h" in the SRC 
>directory.  The stdafx.h is the standard include file used to compile MFC.  
>I always include this file at the very beginning as part of my precompiled 
>header.
>
>Why?

Let me try and guess.  Uh, because you want your builds to include lots of 
things you don't need, lots of things that are dangerous, and you want your 
builds to be as slow as possible so you can later complain about how crummy 
VC++ is in the performance department.  Is that right?

>The "stdafx.h" in SRC includes every header file in the MFC universe, 
>documented or undocumented.  If you include this file, your code will 
>compile if it is any way possible in MFC.  All the #define's and #pragma's 
>are set up to make MFC work.

It also has lots and lots of stuff you don't need.  This clogs the pipes.  It 
bloats your PDB file when you build for debugging, and that in turn slows 
down your machine: your linker and your debugger deal with megabytes of stuff 
they don't care about.

There are dangerous things in MFC\SRC\STDAFX.H.  These things aren't 
dangerous to MFC because MFC was implemented with full knowledge of what's 
going on in there.  But, since you don't know what's going on in there, you 
can get into pretty bad trouble.

One huge problem you'll run into deals with exceptions.  If you _read_ 
MFC\SRC\STDAFX.H, you'll see that it redefines the way the exception macros 
work. MFC uses this redefinition to be efficient, but your code shouldn't use 
it--your code can end up leaking memory.

One medium-sized problem you'll run into involves register packing. I think 
your code ill be a little less portable if you rely on code built with 
_AFX_PACKING instead of the default packing the compiler uses.  I guess 
there's a chance that this will only show up if you start using third-party 
libraries which rely on their own struct packing rules, so you're safe for 
now... you won't be in trouble until later, when you forget.

One minor problem you'll run into is that you can run off and use 
undocumented things without knowing it.  If you suddenly play with an 
undocumented structure, you'll build your empire around it just because 
you've included The World.  But, years later, when that structure changes, 
you'll end up in a heap of trouble because the empire you built upon it will 
come tumbling down.  You didn't even know it was an unsupported, 
implementation-level dodad because it you just included the world--you didn't 
get warnings about AFXIMPL.H not being around.

>The real bonus comes when you use the Visual C++ Cross Platform Edition for 
>the Macintosh.  Rather than having the figure out all the new header files 
>that you need, the "stdafx.h" includes most all the Macintosh and MFC header 
>files that you will ever need.

>They all work together (because they had to 
>build MFC with it) with all the proper #define's and everything.

This brute-force approach will hide problems that you'll probably wish you 
knew about long after they've bitten you.

>That's my recommendation of the week.

I would strongly suggest not applying this advice.

.B ekiM
--
TCHAR szDisc[] = _T("These words are my own; I do not speak for Microsoft.");

-----From: "John Elsbree" 

I don't want to sound repetitious, but I personally wouldn't recommend this 
technique. It will make your compiles take longer, and it virtually guarantees 
that something in your code will fail to compile when you install a newer 
release of MFC.

Stick to only the documented parts of MFC, unless you absolutely *must* do 
otherwise.

mfcTeam.m_johnels;	// does not represent Microsoft

----------
From: 	owner-mfc-l@netcom.com on behalf of dhoward@kset.com

I've actually found it useful to include "afximpl.h" in all my files.  In 
fact, the way that I do it is to include the "stdafx.h" in the SRC 
directory.  The stdafx.h is the standard include file used to compile MFC.  
I always include this file at the very beginning as part of my precompiled 
header.




Steven Lewis -- smlewis@wln.com
Sunday, January 28, 1996

[Mini-digest: 2 responses]

  While I fully agree with the advice to not ROUTINELY include afximpl.h,
there are times when it is required. I have a need to generate classes 
which are essentially identical to MFC classes but slightly different. 
I need, for example, to generate a class equivalent to CScrollView but derived
from CWnd. The best way to do this is to copy and edit the MFC code knowing
that I will have to redo this with each major release. 
   In these limited cases, the file REQUIRES afximpl.h 

-----From: dhoward@kset.com

Of course, when I first wrote this, I knew it would cause this backlash.  

All I can say is that it hasn't hurt me yet.

Before I used this method, the Visual C++ IDE was DOG SLOW.  After I use 
this method, the Visual C++ IDE is still DOG SLOW.  Sorry mikeblas and 
elsbree but your talk doesn't hold up.  Whether or not I use it, it is still 
DOG SLOW.

Yes, yes, I know to avoid afximpl.h.  However, I still know what is 
documented and what isn't.  If you think that hiding "afximpl.h" in the SRC 
directory is going to dissuade people from using it, you are naive.  People 
will just include it in their own "stdafx.h" (instead of in the .cpp file 
that needs it) and the whole program will have access to it.  You may think 
that it is wrong but people will do it anyway.

And, frankly, if the Macintosh Cross-Platform Edition wasn't such a HACK, I 
might not do this.  I spent over a day trying to figure out which files to 
include to get something compiled, then I ripped it all out and replaced it 
with "stdafx.h" and it worked fine.

Besides, I can substitute in my own stuff at any time and recompile.  It's 
only code.  In general, it's a good policy to put buffer classes and include 
files between company code and MFC.  I can always copy in the code, edit it 
directly (which I had to do for the Mac) and bring it under my own source 
control.  All your voodoo and curses aside.

And, I should point out that the code ports between VC++ 1.5 and 4.0.

Dan




| Вернуться в корень Архива |