Creating unique temporary variables using __LINE__ or other macro

T

travis.downs

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
 
V

Victor Bazarov

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
 
T

travis.downs

Drop the semicolon after the macro definition.







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

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

Bo Persson

(e-mail address removed) wrote:
:: On Aug 14, 3:00 pm, "Victor Bazarov" <[email protected]>
:: wrote:
::: (e-mail address removed) 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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top