2016-08-11 2 views
0

следующий код Дано:Что компилятор понимать число + Macro в C

#define CELSIUS *10 

void main() 
{ 
    int testVar=0; 

    if(!testVar) testVar = 10CELSIUS; 
} 

Мой IDE дает мне следующее сообщение: Constant «Celsius» имеет недопустимый суффикс. Но похоже, что программа компилируется. Должен ли я заботиться об этом сообщении?

+0

Вы определяете 'CELSIUM' и использовать' CELSIUS', это опечатка? – Caw

+0

«Но похоже, что программа компилируется». [Это всего лишь иллюзия; он не компилируется] (http://ideone.com/IlncHy). – dasblinkenlight

+0

CELSIUM был ошибкой. Я отредактировал его. – xy36

ответ

2

Суффикс - это что-то «добавленное в конце». Поэтому, когда компилятор жалуется на недопустимом суффикс в конце целой константы, это расстроено одного лексем

10CELSIUS 

как он признает CELSIUS в качестве целого суффикса. Допустимые суффиксы (N1570 § 6.4.4.1/1):

u 
ul 
ull 
l 
lu 
ll 
llu 

Это небольшие L буквы, вверх случай версии каждой буквы допускается, тоже (хотя и не lLLl или в любой комбинации)

Они означают ¯u nsigned, л Ong и л Ong л Ong и влияют на тип предыдущего целая константа.

Таким образом, для достижения Макроподстановки вам нужно separate the integer constant with a space, таким образом, производя маркер CELSIUS, который затем может быть заменен *10 препроцессор:

#include <stdio.h> 
#define CELSIUS *10 

int main() 
{ 
    int testVar=0; 

    if(!testVar) testVar = 10 CELSIUS; 
    printf("%d\n", testVar); 

    return 0; 
} 

Примечания: Это более современные подписи для основных функция. Еще лучше (ИМО) будет int main(int argc, char **argv);

+1

'int main()' не просто «более современно» - 'void main()' всегда был неправильным. – Quentin

1

Becareful. Если вы используете такие макросы, у вас будет много проблем в будущем. Лучше использовать:

/*....*/ 

#define CELSIUS(x) ((x)*10) 

/*....*/ 

if(!testVar) testVar = CELSIUS(10); 
    printf("%d\n", testVar); 

/*....*/ 

Если вы не сделаете это, вы будете иметь много нежелательного поведение в вашем коде, как

Good Programming Practices for Macro Definitions (#define) in C

Смежные вопросы