Preprocessor possibilities

  • Thread starter Christopher Benson-Manica
  • Start date
C

Christopher Benson-Manica

Is it possible to write a macro (in unextended C89) such that

TEST( int, (1,2,3) );

expands to

int array[]={ 1,2,3 };

? I strongly suspect that it is not, but I don't wish to overlook a
solution if one exists.
 
E

Eric Sosman

Christopher Benson-Manica wrote On 12/13/05 12:39,:
Is it possible to write a macro (in unextended C89) such that

TEST( int, (1,2,3) );

expands to

int array[]={ 1,2,3 };

? I strongly suspect that it is not, but I don't wish to overlook a
solution if one exists.

#define TEST(type,list) type array[] = { list }

This seems pretty straightforward -- have I somehow
misread your question?
 
D

David Resnick

Eric said:
Christopher Benson-Manica wrote On 12/13/05 12:39,:
Is it possible to write a macro (in unextended C89) such that

TEST( int, (1,2,3) );

expands to

int array[]={ 1,2,3 };

? I strongly suspect that it is not, but I don't wish to overlook a
solution if one exists.

#define TEST(type,list) type array[] = { list }

This seems pretty straightforward -- have I somehow
misread your question?

What about the parenthesis? I think he is trying to avoid C99 varargs
macros.

-David
 
C

Christopher Benson-Manica

David Resnick said:
What about the parenthesis? I think he is trying to avoid C99 varargs
macros.

Yes, I am. I am dealing with a C++ implementation that does not
support the C99 varargs macros (among other things).
 
E

Eric Sosman

David Resnick wrote On 12/13/05 13:14,:
Eric said:
Christopher Benson-Manica wrote On 12/13/05 12:39,:
Is it possible to write a macro (in unextended C89) such that

TEST( int, (1,2,3) );

expands to

int array[]={ 1,2,3 };

? I strongly suspect that it is not, but I don't wish to overlook a
solution if one exists.

#define TEST(type,list) type array[] = { list }

This seems pretty straightforward -- have I somehow
misread your question?


What about the parenthesis? I think he is trying to avoid C99 varargs
macros.

Aha: I *did* misread the question! Thanks, D R,
and sorry, C B-M.
 
E

Emmanuel Delahaye

Christopher Benson-Manica a écrit :
Is it possible to write a macro (in unextended C89) such that

TEST( int, (1,2,3) );

expands to

int array[]={ 1,2,3 };

? I strongly suspect that it is not, but I don't wish to overlook a
solution if one exists.
The obvious way :

#define TEST(T, a, b, c)\
T array[] = {a, b, c}

int main(void)
{

TEST (int, 1, 2, 3);

return 0;
}

But I guess you want a variable list. Il suggest this :

#include <stdio.h>

int main(void)
{

int array[] =
{
#define ITEM(value)\
value,
#include "test.itm"
#undef ITEM
};

size_t i;

for (i = 0; i < sizeof array / sizeof *array; i++)
{
printf ("array[%u] = %d\n", (unsigned) i, array);
}

return 0;
}

with:

/* test.itm */

ITEM (12)
ITEM (34)
ITEM (56)

which is a trick I got here on c.l.c a few years ago. I'm using it day
and night to automate code generation ! Very powerful ! (Prefcet to give
a string to an enum, for example...)
 
E

Emmanuel Delahaye

Eric Sosman a écrit :
Christopher Benson-Manica wrote On 12/13/05 12:39,:
Is it possible to write a macro (in unextended C89) such that

TEST( int, (1,2,3) );

expands to

int array[]={ 1,2,3 };
#define TEST(type,list) type array[] = { list }

This seems pretty straightforward -- have I somehow
misread your question?

AFAICT, it doesn't work as expected:

#include <stdio.h>

#define TEST(type, list) type array[] = { list }

int main(void)
{
TEST( int, (1,2,3) );

size_t i;

for (i = 0; i < sizeof array / sizeof *array; i++)
{
printf ("array[%u] = %d\n", (unsigned) i, array);
}

return 0;
}

produces

array[0] = 3

Some comma operator trick, I guess...
 
R

Robert Gamble

Christopher said:
Is it possible to write a macro (in unextended C89) such that

TEST( int, (1,2,3) );

expands to

int array[]={ 1,2,3 };

? I strongly suspect that it is not, but I don't wish to overlook a
solution if one exists.

No, there isn't. The closest thing you can do is something like the
following which is quite ugly:

#define TEST(x,y) x array[]={y}
#define SEP ,
TEST(int, 1 SEP 2 SEP 3);

and I am not positive that even this is valid in C89.

Robert Gamble
 
E

Emmanuel Delahaye

Christopher Benson-Manica a écrit :
Is it possible to write a macro (in unextended C89) such that

TEST( int, (1,2,3) );

expands to

int array[]={ 1,2,3 };

? I strongly suspect that it is not, but I don't wish to overlook a
solution if one exists.
The obvious way :

#define TEST(T, a, b, c)\
T array[] = {a, b, c}

int main(void)
{

TEST (int, 1, 2, 3);

return 0;
}

But I guess you want a variable list. Il suggest this :

#include <stdio.h>

int main(void)
{

int array[] =
{
#define ITEM(value)\
value,
#include "test.itm"
#undef ITEM
};

size_t i;

for (i = 0; i < sizeof array / sizeof *array; i++)
{
printf ("array[%u] = %d\n", (unsigned) i, array);
}

return 0;
}

with:

/* test.itm */

ITEM (12)
ITEM (34)
ITEM (56)

which is a trick I got here on c.l.c a few years ago. I'm using it day
and night to automate code generation ! Very powerful ! (Perfect to give
a string to an enum, for example...)
 
D

David Resnick

Christopher said:
Is it possible to write a macro (in unextended C89) such that

TEST( int, (1,2,3) );

expands to

int array[]={ 1,2,3 };

? I strongly suspect that it is not, but I don't wish to overlook a
solution if one exists.

I assume you reject the (clunky)

#define TEST_1(type,val1) type array[]={val1}
#define TEST_2(type,val1,val2) type array[]={val1,val2}
....

-David
 
C

Christopher Benson-Manica

Emmanuel Delahaye said:
But I guess you want a variable list. Il suggest this :

(snip interesting technique)
which is a trick I got here on c.l.c a few years ago. I'm using it day
and night to automate code generation ! Very powerful ! (Perfect to give
a string to an enum, for example...)

That does look like a creative technique, and I'll look for
opportunities to use it. Unfortunately, it doesn't handle the actual
situation I hav; I admit that what I want to do is not a stupendous
idea. The ultimate idea was to allow use of "array literals" (such as
are found in JavaScript) to allow for macros like

if( TEST(int,1,(1,2,3)) ) { /* Checks for second argument in third */
/* ... */
}

None of the other options (inline function, C++ templates, etc.) are
particularly appetizing here either, so it seems that there is no
trick to avoiding tried-and-true (but boring) methods.
 
C

Christopher Benson-Manica

Robert Gamble said:
#define TEST(x,y) x array[]={y}
#define SEP ,
TEST(int, 1 SEP 2 SEP 3);
and I am not positive that even this is valid in C89.

It seems to work on my implementation, FWIW, but I concur that it is
probably too ugly to consider.
 
B

Ben Pfaff

Christopher Benson-Manica said:
That does look like a creative technique, and I'll look for
opportunities to use it. Unfortunately, it doesn't handle the actual
situation I hav; I admit that what I want to do is not a stupendous
idea. The ultimate idea was to allow use of "array literals" (such as
are found in JavaScript) to allow for macros like

if( TEST(int,1,(1,2,3)) ) { /* Checks for second argument in third */
/* ... */
}

For small ranges, you can do something like this:
#define BIT(x) (1ul << (x))
#define BITS(x, y) (BIT(x) | (y))

if (BIT(x) & BITS(1, BITS(2, BIT(3))))
Not ideal.
 
R

Robert Gamble

Jordan said:
David Resnick said:
I assume you reject the (clunky)
#define TEST_1(type,val1) type array[]={val1}
#define TEST_2(type,val1,val2) type array[]={val1,val2}

Yes :)

how about (c99 only)

#define TEST(type,...) type array[] = { __VA_ARGS__ }

Apparently you missed the part about c99 not being an option, but yes,
this would be the obvious solution if it were.

Robert Gamble
 

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

Similar Threads

Functions 2
Order of preprocessor macro replacement 3
Preprocessor commands usage. 11
preprocessor bug? 2
Macro function syntax 11
Preprocessor 4
Preprocessor unique names 6
Preprocessor problem 1

Members online

No members online now.

Forum statistics

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

Latest Threads

Top