Intel C++, макрос для иниц. структуры
От: barrett Россия  
Дата: 24.09.04 22:34
Оценка:
Доброго времени суток!

Не понимаю, почему у Intel C++ Compiler (5.0, 7.0) от этого:

typedef struct
{
  long m_i;
  signed long m_de;
  long double m_mul;
} mant_mult;

#define ITEM(i, dexp, mul) {i, dexp, mul##E##dexp }

static mant_mult reald_mmul[6]=
{
  ITEM( 0,  00, 0.5) ,
  ITEM( 1,  00, 0.25) ,
  ITEM( 2,  00, 0.125) ,
  ITEM( 3, -01, 0.625) ,
  ITEM( 4, -01, 0.3125) ,
  ITEM( 5, -01, 0.15625)
};


срывает крышу:

b_macro2.c(16): error: invalid floating constant
ITEM( 3, -01, 0.625) ,
^

b_macro2.c(16): error: expected a "}"
ITEM( 3, -01, 0.625) ,
^


1. msvc 6.0,7.1 компилируют без ошибок.
2. Если заменить static mant_mult reald_mmul[6]= и далее тем, что выдает препроцессор, то все компилится.
вывод препроцессора:
static mant_mult reald_mmul[6]=
{
  {0, 00, 0.5E00 } ,
  {1, 00, 0.25E00 } ,
  {2, 00, 0.125E00 } ,
  {3, -01, 0.625E-01 } ,
  {4, -01, 0.3125E-01 } ,
  {5, -01, 0.15625E-01 }
};



wbr
Re: Intel C++, макрос для иниц. структуры
От: _Winnie Россия C++.freerun
Дата: 25.09.04 08:22
Оценка:
Здравствуйте, barrett, Вы писали:

B>Доброго времени суток!

B>Не понимаю, почему у Intel C++ Compiler (5.0, 7.0) от этого:
B>срывает крышу:
B>1. msvc 6.0,7.1 компилируют без ошибок.

IC++ основан на frontend от EDG, который, в отличие от Microsoft, к сожалению следует стандарту

А по нему, после применения ## должен получится правильный token. (16.3.3/3)

preprocessing-token:
    header-name
    identifier
    pp-number
    character-literal
    string-literal
    preprocessing-op-or-punc
    each non-white-space character that cannot be one of the above



pp-number:
    digit
    . digit
    pp-number digit
    pp-number nondigit
    pp-number e sign
    pp-number E sign
    pp-number .


Решить проблему, наверное, можно, так:

typedef struct
{
  long m_i;
  signed long m_de;
  long double m_mul;
} mant_mult;

#define ITEM(i, sign, dexp, mul) {i, dexp, sign mul##E##dexp }

static mant_mult reald_mmul[6]=
{
  ITEM( 0, +, 00, 0.5) ,
  ITEM( 1, + ,00, 0.25) ,
  ITEM( 2, +, 00, 0.125) ,
  ITEM( 3, -,01, 0.625) ,
  ITEM( 4, -,01, 0.3125) ,
  ITEM( 5, -,01, 0.15625)
};

int main()
{
}


Если такого кода очень много, то можно воспользоваться MSVC-шнымми регулярными выражениями.
Правильно работающая программа — просто частный случай Undefined Behavior
Re: Intel C++, макрос для иниц. структуры
От: dupamid Россия  
Дата: 27.09.04 06:16
Оценка:
Здравствуйте, barrett, Вы писали:

Попробуй так:
#define _CAT(a, b) a##b
#define CAT(a, b) _CAT(a, b)
#define ITEM(i, dexp, mul) {i, dexp, CAT(mul, CAT(E, dexp)) }

Так будет по Стандарту и все будут понимать
Re[2]: Intel C++, макрос для иниц. структуры
От: dupamid Россия  
Дата: 27.09.04 06:22
Оценка:
Здравствуйте, dupamid, Вы писали:

D>Так будет по Стандарту и все будут понимать


К сожалению, это все равно не по Стандарту, так как временно образуются невалидные pp-token'ы, но во всяком случае это компилируется нормально.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.