Big problem with Small programs
Todor Totev
umbra.tenebris at list.ru
Tue Jan 23 12:02:52 PST 2007
> Walter Bright wrote:
>> Try using enums instead of const variables, they don't take up any
>> space in the object file.
>
> Thanks, but that makes only a dent in the overhead.
Actually using enums instead of consts have a very nice side effect.
Consider this declaration from win32:
HANDLE CreateFileW(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD,
DWORD, HANDLE);
Now, which invocation is correct?
CreateFile("a", OPEN_EXISTING, FILE_SHARE_READ, null, GENERIC_READ ...)
or
CreateFile("a", OPEN_EXISTING, GENERIC_READ, null, FILE_SHARE_READ ...)
or even
CreateFile("a", GENERIC_READ, OPEN_EXISTING, null, FILE_SHARE_READ ...)?
The compiler happily accepts all of them.
Using enums, we have:
enum FILE_SHARE {
READ = 1,
WRITE = 2,
BOTH = READ | WRITE
}
enum DISPOSITION {
CREATE_ALWAYS = 1,
OPEN_EXISTING = 2
}
void CreateFile(char[] fileName, DISPOSITION disposition, FILE_SHARE
share) {}
int main() {
// compiler allows unknown flags
CreateFile("filename", cast(DISPOSITION)4, FILE_SHARE.READ);
// when we swap the arguments by mistake
CreateFile("filename", FILE_SHARE.READ, DISPOSITION.CREATE_ALWAYS);
return 0;
}
This way if I make an error the compiler will very helpfully tell me
what exactly is happening. Consider: CreateFont has 14 parameters,
if the IDE does not help me i'd make an error when I use it, trust me
On the other hand, when a new version of Windows come with expanded options
I can just use the new numbers without breaking anything while the d
package is
updated.
The dotnet framework uses enums and I really like the idea.
Regards,
Todor
More information about the Digitalmars-d
mailing list