2015-11-12 1 views
1

У меня есть проект на C++, который использует DWORD s. Моя проблема заключается в том, что я не знаю, как проверить, является ли этот DWORD стандартом Windows DWORD тип - или пользователь определил его на что-то еще вручную - скажем int.Как определить, определено ли DWORD вручную?

Как я могу проверить это?

Проблема находится на целевой машине, где мне интересно ее проверить. Я не могу запустить Visual Studio. Я могу запустить только некоторый .exe-файл.

На моей машине это отображается как unsigned long, когда я использую «Перейти к определению». Как решить эту проблему? И проверьте, к какому типу на целевой машине относится этот DWORD?

Обновление: кажется, важно только, какой тип DWORD был определен, когда проект был скомпилирован на какой-либо машине - у меня нет доступа к этой машине, у меня есть только источник проекта, который, вероятно, не изменился.

ответ

3

#define для DWORD как unsigned long - это что-то проверка компилятора во время компиляции при создании двоичного исполняемого файла. Этот двоичный файл будет таким же на каждом компьютере, на котором вы его запускаете. если компилятор решил, что ему нужно выделить 4, 8 или 100 байт, когда ему нужно зарезервировать место для DWORD, он будет выделять одинаковое количество байтов на каждом компьютере, на котором он выполняется.

+0

Так важно, кто его скомпилировал? Тогда это не изменится? Мне нужно проверить, что DWORD находится на машине, которая скомпилировала его? –

+0

Да, вы должны быть уверены, что при компиляции исходный код имеет то же #define на всех ПК, где вы компилируете. Скорее всего, если вы используете файл проекта с одинаковыми настройками. –

+0

@ user200312 DWORD является псевдонимом для типа, он компилирует время, он не может измениться во время выполнения – Slava

3

Вопрос сначала кажется глупым, но в нем содержатся некоторые промежуточные анекдоты. Многие разработчики пришли из управляемого мира в родной, и такие вещи, как «это имеет значение на разных процессорах/ОС», на первый взгляд не ясны.

Итак, если вы отправляете Исполняемый, это не имеет значения. после компиляции кода код превращается в неизменный машинный язык, где DWORD остается, как было определено во время компиляции. если он был unsigned long, он остается таким же, как на всех машинах, которые могут запускать исполняемый файл.

Но что произойдет, если мы дадим библиотеку ? неожиданно штук do пункт!
в этом случае (который не является вашим), вы можете использовать std::is_same:

static_assert(std::is_same<DWORD,unsigned long>::value,"DWORD is not unsigned long, fail to compile"); 

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

+0

Моя проблема: я не могу получить доступ к ПК, на котором был скомпилирован проект. У меня двоичный файл. Теперь у меня есть проект и источник - не могу ли я увидеть из источника проекта, как определяется DWORD? (Потому что я не хочу перекомпилировать) –

+0

вы можете (возможно) реконструировать его, но вы не можете просто запустить бинарный и скажите это –

+0

Да, но что у меня источник не помогает? Скорее всего, источник содержит одно и то же определение DWORD, как это было при компиляции –

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