Просто общий вопрос о программировании: когда вы определяете значение в C (или любом другом языке, который я предполагаю), как компилятор узнает, как обращаться со значением? Например:

#define CountCycle  100000

Я бы предположил, что CountCycle является типом данных с "длинным целым", но это только предположение. Я полагаю, это также может быть float, double (не int, так как он достигает максимума в ~ 32k) и т. Д.

Как компилятор выбирает тип данных для значения #define? У меня нет заявки на ответ на этот вопрос; Мне просто любопытно.

4
Diesel 31 Авг 2017 в 16:20

4 ответа

Лучший ответ

компилятор такого не делает. препроцессор заменяет 100000 на CountCycle.

Как только эта замена будет завершена, компилятор может вступить во владение. 100000 имеет тип int, если он может вписаться в этот диапазон, и long, если он не может.

См. справочник по C ++ и Ссылка на C.

12
Noel Widmer 6 Сен 2017 в 14:09

Есть четыре этапа для программы на C, чтобы стать исполняемым:

  1. Предварительная обработка
  2. компиляция
  3. сборочный
  4. Связывание

«Предварительная обработка» является первым этапом.

«#define» - это препроцессор, который обрабатывается перед компиляцией. Вы создаете макросы с помощью директивы #define. После #define следует имя макроса, а затем последовательность токенов, для которой следует использовать аббревиатуру, которая по-разному называется телом макроса, списком расширения или замены.

Например-

Если вы укажете следующее в вашей программе

#define BUFFER_SIZE 1000

Препроцессор заменит имя макроса BUFFER_SIZE на расширение макроса 1000 в файле исходного кода, прежде чем передать его компилятору.

-1
H.S. 31 Авг 2017 в 14:20

CountCycle не имеет типа. Его можно заменить на целочисленную константу 100000 препроцессором везде в программе, где встречается это имя.

Целочисленная константа 100000 имеет тип.

Если целочисленная десятичная константа не имеет суффикса, то (Стандарт C, 6.4.4.1 Целочисленные константы)

5 Тип целочисленной константы является первым из соответствующего списка, в котором может быть представлено ее значение.

int
long int
long long int

Если вы хотите, чтобы константа имела тип long int, вы можете указать суффикс. Например

#define CountCycle  100000l

Если значение константы находится в области типа long int, тогда константа будет иметь тип. В противном случае он будет иметь тип long long int.

Если вы хотите указать плавающую константу, вы должны использовать одно из ее представлений. Например

#define CountCycle  100000.0
0
Vlad from Moscow 31 Авг 2017 в 14:56

Компилятор не делает таких вещей. Препроцессор заменяет 100000 на CountCycle.

Это правда, но вам нужно позаботиться о некоторых опциях компилятора, которые усекают определенное значение. Например, если вы работаете со встроенной платформой, которая не может выполнить вычисление с плавающей запятой во время выполнения, компилятор может неявно преобразовать ваше определение с плавающей запятой в целочисленное определение. В любом случае, вы можете делать математические вычисления во времени компиляции. Почему? Поскольку многие параметры могут повысить точность конечного результата, выполнив этот расчет, вы можете использовать конечный результат, усеченный во время выполнения.

Таким образом, правильный способ его использования - заботиться о том, где вы используете: в середине математики с фиксированной точкой; как плавающие данные; или что-то другое. Хороший способ предотвратить ошибки - явное приведение любого числа, сделав что-то вроде:

#define MY_FLOAT_DATA   (float)4.55
#define MY_INTEGER_DATA (int)4
-1
wnoliveira 31 Авг 2017 в 17:06