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

Creating unique temporary variables using __LINE__ or other macro

P: n/a
Hi,

I'm trying to use a macro to create a unique temporary variable name,
such as

#define TEMP_OBJ(string) MyType obj_ <some magic here(string);

So something like

TEMP_OBJ("foo")

would evaluate to

MyType obj_1234("foo");

Where the 1234 is needed to make it unique. Thing is, I can't find a
good way to make this unique stuff. I tried __LINE__, but I could
find a way to paste it to obj_ to make the variable name.

Any ideas? Surely there must be a common idiom for this.

Travis

Aug 14 '07 #1
Share this Question
Share on Google+
3 Replies


P: n/a
tr**********@gmail.com wrote:
I'm trying to use a macro to create a unique temporary variable name,
such as

#define TEMP_OBJ(string) MyType obj_ <some magic here(string);
Drop the semicolon after the macro definition.
>
So something like

TEMP_OBJ("foo")

would evaluate to

MyType obj_1234("foo");

Where the 1234 is needed to make it unique. Thing is, I can't find a
good way to make this unique stuff. I tried __LINE__, but I could
find a way to paste it to obj_ to make the variable name.

Any ideas? Surely there must be a common idiom for this.
I used

#define CONCAT(a, b) a ## b
#define UNIQUENAME(prefix) CONCAT(prefix, __LINE__)

Which then gets used in another macro

#define PROFILER_ENTRY() \
static MyProfiler::Entry * UNIQUENAME(ppe) = \
MyProfiler::Instance().addEntry(... /* some other stuff */
#define PROFILE_THIS PROFILER_ENTRY
...
int foo() {
PROFILE_THIS();

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Aug 14 '07 #2

P: n/a
On Aug 14, 3:00 pm, "Victor Bazarov" <v.Abaza...@comAcast.netwrote:
travis.do...@gmail.com wrote:
I'm trying to use a macro to create a unique temporary variable name,
such as
#define TEMP_OBJ(string) MyType obj_ <some magic here(string);

Drop the semicolon after the macro definition.
So something like
TEMP_OBJ("foo")
would evaluate to
MyType obj_1234("foo");
Where the 1234 is needed to make it unique. Thing is, I can't find a
good way to make this unique stuff. I tried __LINE__, but I could
find a way to paste it to obj_ to make the variable name.
Any ideas? Surely there must be a common idiom for this.

I used

#define CONCAT(a, b) a ## b
#define UNIQUENAME(prefix) CONCAT(prefix, __LINE__)

Which then gets used in another macro

#define PROFILER_ENTRY() \
static MyProfiler::Entry * UNIQUENAME(ppe) = \
MyProfiler::Instance().addEntry(... /* some other stuff */
#define PROFILE_THIS PROFILER_ENTRY
...
int foo() {
PROFILE_THIS();

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Thanks very much for your response. I had already tried something
very similar (although I had one less level of indirection - no
PROFILE_THIS, just PROFILER_ENTRY). I tried your suggestion exactly
__LINE__ does not get expanded for me, so I get an error about
ppe__LINE__ being redeclared. I cannot make __LINE__ expand out
before the concat, which is very frustrating.

Aug 15 '07 #3

P: n/a
tr**********@gmail.com wrote:
:: On Aug 14, 3:00 pm, "Victor Bazarov" <v.Abaza...@comAcast.net>
:: wrote:
::: travis.do...@gmail.com wrote:
:::: I'm trying to use a macro to create a unique temporary variable
:::: name, such as
:::
:::: #define TEMP_OBJ(string) MyType obj_ <some magic here>
:::: (string);
:::
::: Drop the semicolon after the macro definition.
:::
:::
:::
:::: So something like
:::
:::: TEMP_OBJ("foo")
:::
:::: would evaluate to
:::
:::: MyType obj_1234("foo");
:::
:::: Where the 1234 is needed to make it unique. Thing is, I can't
:::: find a good way to make this unique stuff. I tried __LINE__,
:::: but I could find a way to paste it to obj_ to make the variable
:::: name.
:::
:::: Any ideas? Surely there must be a common idiom for this.
:::
::: I used
:::
::: #define CONCAT(a, b) a ## b
::: #define UNIQUENAME(prefix) CONCAT(prefix, __LINE__)
:::
::: Which then gets used in another macro
:::
::: #define PROFILER_ENTRY() \
::: static MyProfiler::Entry * UNIQUENAME(ppe) = \
::: MyProfiler::Instance().addEntry(... /* some other
::: stuff */ #define PROFILE_THIS PROFILER_ENTRY
::: ...
::: int foo() {
::: PROFILE_THIS();
:::
::: V
::: --
::: Please remove capital 'A's when replying by e-mail
::: I do not respond to top-posted replies, please don't ask
::
:: Thanks very much for your response. I had already tried something
:: very similar (although I had one less level of indirection - no
:: PROFILE_THIS, just PROFILER_ENTRY). I tried your suggestion
:: exactly __LINE__ does not get expanded for me, so I get an error
:: about ppe__LINE__ being redeclared. I cannot make __LINE__ expand
:: out before the concat, which is very frustrating.

If you by any chance use MSVC with precompiled headers, this is a
known bug there. The __LINE__ value is set when the header is
(pre)compiled, not when your source file is compiled.

The workaround offered is to use __COUNTER__ instead of __LINE__.
Bo Persson
Aug 15 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.