Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Stitch Igorek
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 308
Завершенные тесты: 1
#1

Как разделить участки кода в одном исходнике для разных битовых систем

19.08.2016, 07:14. Просмотров 281. Ответов 9
Метки нет (Все метки)

В проекте нужно разделить участки программы примерно таким образом, как показано псевдокодом
C++
1
2
3
4
if (сборка выполняется для х64)
     компилируется эта часть программы;
else if (сборка выполняется для х86)
     компилируется эта часть;
возможно ли такое сделать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2016, 07:14
Ответы с готовыми решениями:

Функции для перевода из разных систем счисления
подскажите функции для перевода из разных систем счисления Добавлено через 1...

Объясните пожалуйста некоторые участки кода
Есть код (Идеально сбалансированное дерево): // #include "stdafx.h"...

Функция вывода шестнадцатеричного кода с помощью битовых полей
Помогите решить задачу: "С помощью битовых полей создайте функцию для вывода...

Как хранить объекты разных классов в одном контейнере
Здравствуйте! Хочу реализовать хранение разных классов(базовый и наследник)...

Внутри участки кода. Прошу опытных сказать что это за вид языка
Здравствуйте!Я до сих пор мучаюсь какие бывают виды c++.вот наконец нашел...

9
Vort_
190 / 190 / 78
Регистрация: 10.07.2012
Сообщений: 400
19.08.2016, 07:53 #2
Можно сделать вот так:
C++
1
2
3
4
5
#if defined(__x86_64__) || defined(_M_X64)
    cout << "64" << endl;
#elif defined(__i386) || defined(_M_IX86)
    cout << "32" << endl;
#endif
2
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,926
19.08.2016, 08:31 #3
Vort_, и как широко распространены эти определения?
0
Vort_
190 / 190 / 78
Регистрация: 10.07.2012
Сообщений: 400
19.08.2016, 08:45 #4
Цитата Сообщение от vxg Посмотреть сообщение
Vort_, и как широко распространены эти определения?
Я взял их из вот этой статьи:
C/C++ tip: How to detect the processor type using compiler predefined macros
Там написано какие компиляторы что из этого поддерживают.
1
Байт
Эксперт C
17943 / 11933 / 2479
Регистрация: 24.12.2010
Сообщений: 24,043
19.08.2016, 08:46 #5
А вот так можно (не уверен)
C++
1
2
3
4
5
6
if (sizeof(int)==8) {
 ...
}
else {
 ...
}
И 2 раза компилить не надо...
1
Vort_
190 / 190 / 78
Регистрация: 10.07.2012
Сообщений: 400
19.08.2016, 09:01 #6
Цитата Сообщение от Байт Посмотреть сообщение
А вот так можно (не уверен)
Это если внутри if-а нет ничего специфичного для конкретной архитектуры (к примеру, ассемблерных вставок)

Добавлено через 13 минут
upd. И проверять в таком случае лучше указатель (к примеру, void*).
2
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
19.08.2016, 12:18 #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct x86 {};
struct x64 {};
 
typedef x86 current_system_t;
 
void func(x86) {}
void func(x64) {}
void func() { func(current_system_t()); }
 
int main()
{
    func();
}
3
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,027
Записей в блоге: 2
Завершенные тесты: 1
19.08.2016, 17:45 #8
C++
1
2
3
4
5
6
7
8
#ifdef _WIN64
    if(isWow64())
        // Программа запущена на х86, но скомпилирована на х64
    else
        // Программа запущена на х64, и скомпилирована на х64
#else
    // Программа запущена на х86, и скомпилирована на х86
#endif
Добавлено через 19 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
BOOL isWow64()
{
    BOOL bIsWow64 = FALSE;
 
    typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
 
    LPFN_ISWOW64PROCESS fnIsWow64Process;
    fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
        GetModuleHandle(TEXT("kernel32")), "IsWow64Process");
 
    if (NULL != fnIsWow64Process)
    {
        if (!fnIsWow64Process(hProc, &bIsWow64))
        {
            //handle error
        }
    }
    return bIsWow64;
}
2
Убежденный
Ушел с форума
Эксперт С++
15954 / 7266 / 1178
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
19.08.2016, 18:40 #9
Еще один, более компактный, вариант реализации:
C++
1
2
3
4
5
6
7
// Только для 32-битного кода. В x64 сразу можно возвращать false.
bool isWow64()
{
    SYSTEM_INFO SysInfo;
    GetNativeSystemInfo(&SysInfo);
    return (PROCESSOR_ARCHITECTURE_AMD64 == SysInfo.wProcessorArchitecture);
}
2
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,027
Записей в блоге: 2
Завершенные тесты: 1
19.08.2016, 19:29 #10
Убежденный,
Цитата Сообщение от Убежденный Посмотреть сообщение
// Только для 32-битного кода. В x64 сразу можно возвращать false.
C++
1
2
3
4
5
6
7
8
9
bool isWow64()
{
#ifdef _WIN64
    return false;
#endif
    SYSTEM_INFO SysInfo;
    GetNativeSystemInfo(&SysInfo);
    return (PROCESSOR_ARCHITECTURE_AMD64 == SysInfo.wProcessorArchitecture);
}
0
19.08.2016, 19:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2016, 19:29

Как правильно разделить файл исходного кода?
Имеем работающий код на ВС++ 6 (более 10 тысяч строк) в одном *.cpp Нужно...

Объединить три разных кода в одном скрипте
Здравствуйте. Есть около 3 скриптов написанных на VBS. Хочу их объединить в...

Как найти решение по вставке введенного текста в определенные участки кода BAT
Доброго времени суток уважаемые гуру. Помогите найти решение проблемы. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru