By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,441 Members | 1,831 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,441 IT Pros & Developers. It's quick & easy.

macro definition contains #include directive

P: n/a
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

Nov 5 '08 #1
Share this Question
Share on Google+
6 Replies


P: n/a
-----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-----
Nov 5 '08 #2

P: n/a
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.
Nov 5 '08 #3

P: n/a
-----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+cUiIHNoI5QCfe8p5BsWgNF 5Lc/gkTx+wEkLt
vuMAmgL1KlnhEUdUfeHDUjmapG7VWo5D
=ir8y
-----END PGP SIGNATURE-----
Nov 5 '08 #4

P: n/a
On Nov 5, 4:38 pm, Pawel Dziepak <pdzie...@quarnos.orgwrote:
>
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/2...lude-directive
Nov 5 '08 #5

P: n/a
On Nov 5, 9:06 pm, Bing <bing.j...@gmail.comwrote:
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:ja*********@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
Nov 6 '08 #6

P: n/a
Bing <bi*******@gmail.comwrites:
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__
Nov 6 '08 #7

This discussion thread is closed

Replies have been disabled for this discussion.