Доброго времени суток!
Не понимаю, почему у 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
Здравствуйте, 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-шнымми регулярными выражениями.
Здравствуйте, 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)) }
Так будет по Стандарту и все будут понимать
Здравствуйте, dupamid, Вы писали:
D>Так будет по Стандарту и все будут понимать
К сожалению, это все равно не по Стандарту, так как временно образуются невалидные pp-token'ы, но во всяком случае это компилируется нормально.