preprocessor expansion and defines

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi

I'm trying to write a code that has several functions that are, more
or less, the same and only differ in the datatype on which they
operate. To minimise code duplication I'm trying to accomplish this
using the preprocessor and it's more or less working but I'm having
problems with one of the functions. The actual code is quite
complicated but I've reproduced the issue with a simple test code as
follows:

$ cat test.c
#include <stdio.h>

#define TYPECODE I8
#include "test_source.c"
#undef TYPECODE

int main()
{
  I8_test();
  return 0;
}
$ cat test_source.c
#define CONCAT2x(a,b) a##b
#define CONCAT2(a,b) CONCAT2x(a,b)
#define STRING(a) #a
#define FUNC CONCAT2(TYPECODE,_test)

int FUNC()
{
  static int filenum=0;
  char fname[FILENAME_MAX];
  snprintf(fname, FILENAME_MAX, "%s_vector.%03d", \
    STRING(TYPECODE), filenum++);
  printf("%s: %s\n", __func__, fname);
  return 0;
}
$ gcc test.c
$ ./a.out
I8_test: TYPECODE_vector.000
$

The problem is that I need the output of the code to be

I8_test: I8_vector.000

Looking at the output from cpp it seems like it should be doing the right thing:

int I8##_test()
{
  static int filenum=0;
  char fname[1024];
  snprintf(fname, 1024, "%s_vector.%03d", #I8, filenum++);
  printf("%s: %s\n", __func__, fname);
  return 0;
}

But something is clearly wrong. Can anyone see what I'm doing wrong?

Cheers

Adam


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux