Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

macro definition contains #include directive

315 views
Skip to first unread message

Bing

unread,
Nov 5, 2008, 3:06:35 PM11/5/08
to
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

Pawel Dziepak

unread,
Nov 5, 2008, 3:18:28 PM11/5/08
to
-----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.mozdev.org

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

Noah Roberts

unread,
Nov 5, 2008, 4:26:07 PM11/5/08
to

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

unread,
Nov 5, 2008, 4:38:56 PM11/5/08
to
-----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.mozdev.org

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

Bing

unread,
Nov 5, 2008, 5:16:11 PM11/5/08
to
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-directive

James Kanze

unread,
Nov 6, 2008, 3:35:39 AM11/6/08
to

> 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...@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

Pascal J. Bourguignon

unread,
Nov 6, 2008, 6:40:01 AM11/6/08
to
Bing <bing...@gmail.com> writes:

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__

0 new messages