I am writing file conversion code from a proprietary file format to one more generic. My goal is to support multiple versions of the manufacturer's file format.
I have a multiple versions of the same proprietary headers. The headers define various structs which comprise the main file header (the file is simply a large header followed by raw data).
I need to read the first 4 bytes of the source file to determine the file version. The file version, in turn, tells me which version of the C-structs was used to create the file.
The issues are:
- I can't modify the proprietary headers
- The headers do not use namespaces or classes
- There are a good handful of macros defined in the headers
Possible solutions:
- Build different converter binaries for each file version type :-(
- Inconvenient for both user and developer
- Dynamically load libraries for each version
- The converter is plugin-oriented, so there's already a lot of this happening
I have tried hacking with namespaces:
namespace version1 {
#include "version1.h"
}
namespace version2 {
#include "version2.h"
}
int main (void) {
version1::header *hdr = new version1::header;
return 0;
}
But this won't work because of include guards, and because there are multiple macros are redefined in each header.
Is there an elegant way to handle this?
You could use two different source files, together with a forward declaration:
Another alternative is to implement a wrapper class, which has a base-class that is just an empty shell:
header_base.cpp:
and then implement, in two separate
in headerv1.h:
header_v1.cpp:
And similar for header_v2.h and header_v2.cpp.