[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.c++

macro definition contains #include directive

Bing

11/5/2008 8:07:00 PM

Hi folks,
Is there a way to define a macro that may contain #include
directive in its body. If I just put
the "#include", it gives error C2162: "expected macro formal
parameter" since here I am not using
# to concatenate strings. If I use "\# include", then I receive the
following two errors:

error C2017: illegal escape sequence
error C2121: '#' : invalid character : possibly the result of a macro
expansion

Any help?

Thanks,
Bing Jian

6 Answers

Pawel Dziepak

11/5/2008 8:18:00 PM

0

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Bing wrote:
> Is there a way to define a macro that may contain #include
> directive in its body. If I just put
<snip>

No, preprocessor directives in C++ (and C) are not reflective.

Pawel Dziepak

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail....

iEYEARECAAYFAkkR/5QACgkQPFW+cUiIHNrengCgmsl1wT5R9t4lKh2iu+f2xsPO
uNMAn0Q4VWBUeVUkLN6UsDB0FzkE3AY5
=BCqQ
-----END PGP SIGNATURE-----

john

11/5/2008 9:26:00 PM

0

Bing wrote:
> Hi folks,
> Is there a way to define a macro that may contain #include
> directive in its body. If I just put
> the "#include", it gives error C2162: "expected macro formal
> parameter" since here I am not using
> # to concatenate strings. If I use "\# include", then I receive the
> following two errors:
>
> error C2017: illegal escape sequence
> error C2121: '#' : invalid character : possibly the result of a macro
> expansion
>
> Any help?

Look at the boost preprocessor metaprogramming library. The
BOOST_PP_ITERATE() macro is able to do it. See what it's doing or maybe
just use it.

Pawel Dziepak

11/5/2008 9:39:00 PM

0

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Noah Roberts wrote:
> Look at the boost preprocessor metaprogramming library. The
> BOOST_PP_ITERATE() macro is able to do it. See what it's doing or maybe
> just use it.

Macro can be an argument of #include directive and that's how
BOOST_PP_ITERATE() is used in boost (it's probably the solution for
Bing's problem). However, macro can't contain #include directive.

Pawel Dziepak
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail....

iEYEARECAAYFAkkSEnAACgkQPFW+cUiIHNoI5QCfe8p5BsWgNF5Lc/gkTx+wEkLt
vuMAmgL1KlnhEUdUfeHDUjmapG7VWo5D
=ir8y
-----END PGP SIGNATURE-----

Bing

11/5/2008 10:16:00 PM

0

On Nov 5, 4:38 pm, Pawel Dziepak <pdzie...@quarnos.org> wrote:
>
> Noah Roberts wrote:
> > Look at the boost preprocessor metaprogramming library. The
> > BOOST_PP_ITERATE() macro is able to do it. See what it's doing or maybe
> > just use it.
>
> Macro can be an argument of #include directive and that's how
> BOOST_PP_ITERATE() is used in boost (it's probably the solution for
> Bing's problem). However, macro can't contain #include directive.
>
> Pawel Dziepak

Thanks for the answers. Just let you know I started a topic on this at
stackoverflow.com
http://stackoverflow.com/questions/266501/macro-definition-containing-include...

James Kanze

11/6/2008 8:36:00 AM

0

On Nov 5, 9:06 pm, Bing <bing.j...@gmail.com> wrote:

> Is there a way to define a macro that may contain #include
> directive in its body. If I just put the "#include", it
> gives error C2162: "expected macro formal parameter" since
> here I am not using # to concatenate strings. If I use "\#
> include", then I receive the following two errors:

> error C2017: illegal escape sequence
> error C2121: '#' : invalid character : possibly the result of a macro
> expansion

> Any help?

No. After expansion, "the resulting completely macro-replaced
preprocessing token sequence is not processed as a preprocessing
directive even if it resembles one" [§16.3.4/3]. In other
words, even if there were a way of introducing a sequence
"#include" in the expansion, it wouldn't be an include
directive.

What problem are you trying to solve with this?

--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

pjb

11/6/2008 11:40:00 AM

0

Bing <bing.jian@gmail.com> writes:

> Hi folks,
> Is there a way to define a macro that may contain #include
> directive in its body. If I just put
> the "#include", it gives error C2162: "expected macro formal
> parameter" since here I am not using
> # to concatenate strings. If I use "\# include", then I receive the
> following two errors:
>
> error C2017: illegal escape sequence
> error C2121: '#' : invalid character : possibly the result of a macro
> expansion
>
> Any help?

It is not possible with cpp, however it's trivial to do with make and
sed (or awk or anything else):

-----------(Makefile)--------------------------

example.c : example.cm
sed -e 's/EXPAND(\(.*\))/@#define SOMEVAR 1@#include <\1.h>@#define SOMEVAR_\1 2@/g' < example.cm |tr '@' '\012' > example.c

# ...
-----------------------------------------------


----------(example.cm)-------------------------
/* -*- mode:c -*- */

EXPAND(ModuleA)

EXPAND(ModuleB)

/**** THE END ****/
-----------------------------------------------



Then typing make example.c will generate the file:

-------------(example.c)------------------------------
/* -*- mode:c -*- */


#define SOMEVAR 1
#include <ModuleA.h>
#define SOMEVAR_ModuleA 2



#define SOMEVAR 1
#include <ModuleB.h>
#define SOMEVAR_ModuleB 2


/**** THE END ****/
-------------------------------------------------------

--
__Pascal Bourguignon__