C preprocessing magic

I am trying to use preprocessing tricks to declare a magic variable. Something like that:

DECLARE(x)

should expand to

int _DECLARED_VARIABLE_x_LINE_12

if the ad was on line 12 of the input source. I tried using the ## token-pasting command and the macro __LINE__, but I either get the uninterpreted " __LINE__" there, or the preprocessor seems to completely ignore my line. My last guess:

 #define DECLARE(x) _DECLARED_VARIABLE_ ## x ## _LINE_ ## __LINE__
+3
source share
4 answers

The usual trick in such cases is to use a second macro. However, this does not seem to work with GCC (4.5.1 on MacOS X 10.6.4), and a third level of macro is needed:

#define DECLARE(x) _DECLARED_VARIABLE_ ## x ## _LINE_ ## __LINE__

#define DECLARE42(x, line) _DECLARED_VARIABLE_ ## x ## _LINE_ ## line
#define DECLARE41(x, line) DECLARE42(x, line)
#define DECLARE40(x) DECLARE41(x, __LINE__)

int DECLARE(y);
int DECLARE40(c) = 129;

The output of 'gcc -E':

# 1 "magicvars.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "magicvars.c"






int _DECLARED_VARIABLE_y_LINE___LINE__;
int _DECLARED_VARIABLE_c_LINE_8 = 129;

, , .

, - .


, , :

#define DECLARE(x) _DECLARED_VARIABLE_ ## x ## _LINE_ ## __LINE__

#define DECLARE11(x, line) _DECLARED_VARIABLE_ ## x ## _LINE_ ## line
#define DECLARE10(x) DECLARE11(x, __LINE__)

#define DECLARE23(line) _LINE_ ## line
#define DECLARE22(x) _DECLARED_VARIABLE_ ## x
#define DECLARE21(x, line) DECLARE22(x) ## DECLARE23(line)
#define DECLARE20(x) DECLARE21(x, __LINE__)

#define DECLARE32(line) _LINE_ ## line
#define DECLARE31(x, line) _DECLARED_VARIABLE_ ## x ## DECLARE32(line)
#define DECLARE30(x) DECLARE31(x, __LINE__)

#define DECLARE42(x, line) _DECLARED_VARIABLE_ ## x ## _LINE_ ## line
#define DECLARE41(x, line) DECLARE42(x, line)
#define DECLARE40(x) DECLARE41(x, __LINE__)


int DECLARE(y);
int DECLARE10(z) = 12;
int DECLARE20(a) = 37;
int DECLARE30(b) = 91;
int DECLARE40(c) = 129;

, . . ( , Sun C , GCC .)

+9

## , . , __LINE__ "" , __LINE__ .

, , ,

#define DECLARE_(x, L) _DECLARED_VARIABLE_##x##_LINE_##L
#define DECLARE(x) DECLARE_(x, __LINE__)

.

- C/++: , ##, . L __LINE__, __LINE__ .

L, " "

#define DECLARE__(x, L) _DECLARED_VARIABLE_##x##_LINE_##L
#define DECLARE_(x, L) DECLARE__(x, L)
#define DECLARE(x) DECLARE_(x, __LINE__)

DECLARE_(x, L) L: __LINE__, __LINE__ . DECLARE__ .

+6

debug Visual Studio __LINE__, Edit Continue. . . , .

+1

##:

  • ## .
  • , ##.
0

Source: https://habr.com/ru/post/1761836/


All Articles