#define для беззнакового длинного

Я пытаюсь использовать директиву #define, чтобы изменить все «ulong» на «unsigned long». Вот пример:

#define ulong unsigned long
ulong idCounter = 0;

К сожалению, я думаю, что в конечном итоге ulong заменяется на «unsigned», а не на «unsigned long». Я пробовал "#define ulong (unsigned long)", но это тоже не сработало.


person Anthony    schedule 31.10.2009    source источник
comment
Нет, не должно быть. Что заставляет вас думать, что? И вам действительно следует использовать typedef вместо #define.   -  person Adam Rosenfield    schedule 31.10.2009
comment
Я обнаружил, в чем была моя проблема, это была ошибка где-то еще в коде (я изменил #define на const, но забыл добавить =). Я новичок в #define и пытался их понять. Я просто буду использовать typedef в будущем.   -  person Anthony    schedule 31.10.2009
comment
Именно поэтому вам не следует использовать #defines.   -  person aib    schedule 31.10.2009


Ответы (3)


Лучше использовать typedef. Причина, по которой ваш макрос может не работать, заключается в том, что в некоторых местах он может быть синтаксически неверным. Рассмотреть возможность:

double x = calc();
ulong v = ulong(x);

В этом случае вы получаете

unsigned long v = unsigned long(x);

Это недопустимо, потому что используемая форма приведения несовместима с тем, как вы называете тип (он должен состоять из более простой формы, например, из одного слова). Используйте определение типа:

typedef unsigned long ulong;
person Johannes Schaub - litb    schedule 31.10.2009
comment
Теперь я понимаю; не знал, что есть существенная разница. Я воздержусь от использования #define для такой подстановки в будущем. - person Anthony; 31.10.2009
comment
На самом деле, я никогда не видел, чтобы бросок был сделан таким образом — я всегда делаю это как (ulong)x, и это сработает. Но если ваш синтаксис верен (и у меня нет причин сомневаться в этом, @litb), вы поднимаете хороший вопрос. +1. - person paxdiablo; 31.10.2009
comment
@paxdiablo, ну, это функция только C ++, в C нет такого приведения. Это единственное, что я могу придумать, чтобы сломаться здесь - не уверен, есть ли другие места. Для других вещей, есть и другие места, которые также влияют на C: например, #define intptr int* сломается для intptr a, b;. Спасибо за доверие, приятель :) - person Johannes Schaub - litb; 31.10.2009
comment
Опять же, вы не можете написать ulong long с определением типа. Не уверен, доказывает ли это превосходство макросов или присущее им зло;) - person MSalters; 02.11.2009

почему бы вам не использовать только typedef?

typedef unsigned long ulong;
person Jack    schedule 31.10.2009

Ваш макрос работает нормально:

cpp ulong.c

дает

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

unsigned long idCounter = 0;

Первоначально я предполагал, что у вас уже есть typedef с именем ulong и вы пытаетесь переопределить его с помощью препроцессора, но у других людей на это другое мнение. Если вы действительно хотите ulong, вы должны использовать typedef, как они сказали.

person Community    schedule 31.10.2009