c++ - How to best safeguard against mismatch of (compiler) flags between library (source) and application (header) compilations? -


While implementing some interfaces, as given in the header file, how to distinguish between a combination of library implementation Prevent header file?

Description : A library is provided by the interface header file, say, foo.h , and its implementation by some source file, say , foo.cc . The latter has been compiled to create a library, say, libfoo.so , while the former # written by an application & lt; & Gt; ed, which is the libfoo. . . .

  // foo.h namespace foo {class bar {# ifdef SomeOption std :: int32_t x [2]; # Als std :: int64_t x [2]; #endif bar const * ptr; / * ... * /}; }   

Then offset of ptr is either 8 or 16 bytes, which depends on SomeOption (and Sizeof (also bar)) is also different). Now, if the library was compiled with a different value from the app for SomeOption , then obviously the serious problem will arise (which is difficult to debug for unknown).

A solution? Therefore, I have come up with the following idea

  // namespace foo {enum {hasSomeOption = 1}; Int options_flags () {return 0 #ifdef SomeOption | Hesomoison #ndif; } Class bar {/ * ... as before / bar (some_args, int); Public: Bar (some_args): Bar (some_args, options_flags ()) {} // what's option_flags ()? / * ... * /}; }   

and

  // foo.cc namespace {const int src_flags = options_flags (); // flag_name} fo {bar :: bar (some_args, int app_flags) {loud (app_flags == src_flags) used to compile library source; / * ... * /}}   

With the idea that emphasis will catch any incompatibility, however, it does not work: compiler is my Ideas seem to be favorable and are never triggered, even if SomeOption was different for library and application compilation.

Question Is the best way to deal with this type of problem?

I hope there is a better way, but you always place class or namespace based on options Can change the name so that if someone uses the wrong compiler option - then the class will not be found.

It is better to change the namespace name - this will not cause much confusion when using the debugger:

  #ifdef SomeOption #define foo foo_32bit #else #define foo foo_64bit #endif namespace foo {....}   

I think this will work, but it's definitely ugly.

Comments

Popular posts from this blog

Pass DB Connection parameters to a Kettle a.k.a PDI table Input step dynamically from Excel -

multithreading - PhantomJS-Node in a for Loop -

c++ - MATLAB .m file to .mex file using Matlab Compiler -