[C2hs] preprocessor questoin
Manuel M T Chakravarty
chak@cse.unsw.edu.au
Wed, 16 Apr 2003 00:19:45 +1000 (EST)
Axel Simon <A.Simon@ukc.ac.uk> wrote,
> I am trying to use the conditional compilation feature of the latest release of c2hs. My
> code looks something like this:
>
> #include <gtk/gtkversion.h>
>
> #if GTK_CHECK_VERSION(2,2,0)
>
> treeStoreRemove :: (TreeStoreClass ts) => ts -> TreeIter -> IO Bool
> treeStoreRemove ts ti = liftM toBool $
> {#call tree_store_remove#} (toTreeStore ts) ti
>
> #else
>
> treeStoreRemove :: (TreeStoreClass ts) => ts -> TreeIter -> IO ()
> treeStoreRemove ts ti = {#call tree_store_remove#} (toTreeStore ts) ti
>
> #endif
>
> First of all there is a but that a newline in front of each # is lost so that cpp
> conditionals wind up on the line above (which was of course a comment, so passed
> unnoticed...).
You mean that c2hs drops the newline in front of each cpp directive?
> But more important is that the test yields true but c2hs compiles the second
> version. The created .h file looks like this:
>
> #include "gtk/gtktreestore.h"
> #include <gtk/gtkversion.h>
> #if GTK_CHECK_VERSION(2,2,0)
> struct C2HS_COND_SENTRY_1;
> #else
> #endif
>
> I don't know how the mechanism is to work but I though that with C2HS_COND_SENTRY_1
> defined code segment #1 would be inserted and similar for a C2HS_COND_SENTRY_2 which is
> kind of missing.
The mechanism works by c2hs running the generated .h through
cpp and then checking whether or not `C2HS_COND_SENTRY_1' is
defined in the pre-processed header.
Anyway, I just checked your example and I think I messed
something up in the released version. I'll have a closer
look and let you know once it's fixed.
Thanks,
Manuel