2016-03-27 3 views
0

Я хочу иметь следующие размеры, когда я компилирую (с помощью Visual C++ 2015 и/или Intel C++ 16,0)x86-64 MSVC++/Intel C++ изменение размера междунар, длинный и т.д.

  • обугленного 32 бита без знака (для UTF-32 символов)
  • коротких 32 бита
  • INT 64 бит
  • длину 128 бит
  • указателей и size_t 64 бита (которые они в настоящее время)

Можно ли это изменить? Мое текущее решение использует макросы:

#define int int64_t 
#define char char32_t // Is this unsigned? 
#define short int32_t 
#define long __int128 

Но есть проблемы, как «ИНТ основных» не работает ... И я не могу определить «подписанный» ИНТ «неподписанные Int» и т.д., как макроимена не может иметь пробелов

EDIT: Причина, по которой я хочу это сделать, - улучшить удобочитаемость (поэтому мне не нужно писать int64_t ...), а также сделать любой код, который я использую, который использует int/char/short/long, чтобы автоматически обновлять (при перекомпиляции) использование 64/32/32/128 бит без необходимости изменять его напрямую.

+0

Единственный способ заставить 'signed int' вести себя так, как вы ожидаете, это изменить компилятор. Который, будучи Microsoft, вы не сможете. –

+0

То, что вы пытаетесь сделать, похоже на идею _spectacularly bad_ для начала. Он пахнет [проблемой X Y] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Не могли бы вы изменить свой вопрос, объясняя _why_ вы хотите это сделать? – jbm

+0

В стандарте явно указано * «Единица перевода не должна содержать имена #define или #undef, лексически идентичные ключевым словам» *. 'int main '- это только одна проблема - рассмотрите, что происходит с любым стандартным заголовком, который вы включаете. –

ответ

0

Это не нужно использовать макрос при определении неподписанных Int, вы можете написать код вроде следующего:

typedef unsigned int UINT;

теперь вы можете также писать код, как это:

#define UINT balabala

1

Вы не можете этого сделать. Единственный правильный способ добиться этого - ввести свои собственные типы и использовать их вместо этого.

Кроме того, при использовании таких типов, как int, вы не должны зависеть от базового размера, кроме того, что говорит стандарт (т. Е. В случае int единственной гарантией является то, что он составляет не менее 16 бит). То, что вы хотите достичь, - это зависимость, которой вы не должны быть, и это сделает ваш код совершенно неспортивным. Кроме того, я не понимаю, почему int64_t будет менее разборчивым, чем с использованием int. Кроме того, переопределение, которое вы хотите, станет неожиданным для других разработчиков и, вероятно, вызовет ошибки. Использование ваших собственных типов делает его явным, что типы разные.