Текущий архив: 2008.09.07;
Скачать: CL | DM;
Вниз
C++ дефайны и выравнивание. Найти похожие ветки
← →
Riply © (2008-07-20 07:53) [0]Здравствуйте !
Допустим, есть у нас такой "дефайн":
#define RTL_CONSTANT_STRING(s) { sizeof(s)-sizeof((s)[0]), sizeof(s), s }
и мы, с его помощью декларируем константу:
const UNICODE_STRING TestFile = RTL_CONSTANT_STRING(L"\\??\\E:\\Delete Files\\TestFile.txt");
Дело происходит под C++Builder 2006.
Все работает и не вякает :)
Теперь меняем настройки CodeGuard
После включения опции "All CodeGuard options on", я столкнулась с тем,
что при данной инициализации TestFile`а, его Buffer может получиться
не выровненным даже на 16-битную границу. (Зависит от фазы луны, но проявляется довольно часто :)
Разумеется, после этого Nt - функции, его принимающие начинают ругаться,
причем не цензурно :)
Например, имеем такой код:
UNICODE_STRING TestFile;// = RTL_CONSTANT_STRING(L"\\??\\E:\\Delete Files\\TestFile.txt");
RtlInitUnicodeString(&TestFile, L"\\??\\E:\\Delete Files\\TestLogFile.txt");
Он работает, при любых настройках CodeGuard`а.
Но стоит раскоментировать кусокчек первой строки (оставлять или убирать вторую - роли не играет),
как данный код, становится роботоспособным, только при выключенном CodeGuard.
У меня есть много UNICODE_STRING констант, которые надо инициализировать.
Как это сделать так, чтобы их Buffer при этом был "выровнен" на 32-битную границу
и это не зависило от всяких внешних настроек типа CodeGuard`а ?
← →
ketmar © (2008-07-20 14:19) [1]не использовать быдлер?
---
All Your Base Are Belong to Us
← →
Simpson © (2008-07-20 14:31) [2]Ось какая?
← →
Riply © (2008-07-20 14:46) [3]> [1] ketmar © (20.07.08 14:19)
> не использовать быдлер?
А кто такой "быдлер" ?
> [2] Simpson © (20.07.08 14:31)
> Ось какая?
XP SP2 (а может и SP3 - поставила на автоматическое обновление. Не знаю установился или нет)
← →
@!!ex © (2008-07-20 15:43) [4]> А кто такой "быдлер" ?
Builder... Чесс слово KDevelop или MSVC++ - лучше.
← →
Anatoly Podgoretsky © (2008-07-20 15:57) [5]> Riply (20.07.2008 14:46:03) [3]
> XP SP2 (а может и SP3
Правая кнопка на "Мой компьютер" и свойства.
← →
Riply © (2008-07-20 17:07) [6]> [4] @!!ex © (20.07.08 15:43)
>Builder... Чесс слово KDevelop или MSVC++ - лучше.
Чем лучше ?
Я еще не определилась со средой. Компилю под Builder и VS 2005 поочереди :)
> [5] Anatoly Podgoretsky © (20.07.08 15:57)
> Правая кнопка на "Мой компьютер" и свойства.
Спасибо :)
Значит я не обновилась - сижу под SP2 :)
← →
Anatoly Podgoretsky © (2008-07-20 17:18) [7]> Riply (20.07.2008 17:07:06) [6]
Скачай вручную, до 300 мб на язык и запусти установку, несколько часов.
← →
Riply © (2008-07-20 17:23) [8]> [7] Anatoly Podgoretsky © (20.07.08 17:18)
> Скачай вручную, до 300 мб на язык и запусти установку, несколько часов.
Анатолий, я под Dial-up`ом сижу. И, пока еще, нет возможности изменить это :(
← →
Simpson © (2008-07-20 18:06) [9]А что ты вообще хотела сделать?
← →
Riply © (2008-07-20 18:09) [10]> [9] Simpson © (20.07.08 18:06)
> А что ты вообще хотела сделать?
Мне надо объявить UNICODE_STRING`ские константы.
← →
Simpson © (2008-07-20 18:10) [11]Через #define никак?
← →
Simpson © (2008-07-20 18:13) [12]ИМХО слишком все запутанно, выравнивание по 32 зачем?
← →
Riply © (2008-07-20 18:16) [13]> [11] Simpson © (20.07.08 18:10)
> Через #define никак?
RTL_CONSTANT_STRING
> [12] Simpson © (20.07.08 18:13)
> ИМХО слишком все запутанно, выравнивание по 32 зачем?
Для спокойной работы с Nt-функциями.
← →
Simpson © (2008-07-20 18:27) [14]Code::Block попробывал что то подобное изобразить мосск вскипел))
Если все тоже сделать inline функцией и отладить нормально у же как функцию.
Скорость от этого постардать не должна.
← →
Riply © (2008-07-20 19:34) [15]> [14] Simpson © (20.07.08 18:27)
> Если все тоже сделать inline функцией и отладить нормально у же как функцию.
> Скорость от этого постардать не должна.
Да можно, конечно...
Но я терпеть не могу удирать от проблем
и оставлять за спиной нерешенные (непонятые) вещи.
Уж не говоря о том, что что-то подобное может произойти в другом месте и в другое время.
← →
Simpson © (2008-07-20 19:41) [16]Riply © (20.07.08 19:34) [15]
ИМХО где то в функции не стыковка, на define точку останова не поставиш, отладить функцию и уже отлаженную закинуть в define. Только следующий программист повеситься сопровождая))
← →
guav © (2008-07-20 20:00) [17]Я так понял, цель - инициализировать UNICODE_STRING именно статически, и именно заставив препроцесор сгенерить весь код ?
Предлагаю что-то вроде (__declspec(align(1024)) заменить на то что в билдере):#define DECLARE_RTL_CONSTANT_STRING(d, s) \
__declspec(align(1024)) const WCHAR d##_value[sizeof(s)/sizeof(WCHAR)] = { s }; \
const UNICODE_STRING d = \
{sizeof(s)-sizeof((s)[0]), sizeof(s), const_cast<WCHAR*>(d##_value) };
← →
guav © (2008-07-20 20:01) [18]
DECLARE_RTL_CONSTANT_STRING(TestFile, L"\\??\\E:\\Delete Files\\TestFile.txt")
...
wprintf(L"%p == %.*s", TestFile.Buffer, TestFile.Length, TestFile.Buffer);
← →
Riply © (2008-07-20 20:36) [19]> [17] guav © (20.07.08 20:00)
Привет :)
> Я так понял, цель - инициализировать UNICODE_STRING именно статически,
> и именно заставив препроцесор сгенерить весь код ?
Угу - по отношению к первой половине фразы, ибо вторая еще пока сложна для моего восприятия :)
> Предлагаю что-то вроде (__declspec(align(1024)) заменить на то что в билдере):
Спасибо. Побежала искать "то что в билдере".
P.S.
Под VS, как я поняла этот код работет ? (Я там (под VS) тоже сижу :)
← →
имя (2008-07-20 20:39) [20]Удалено модератором
← →
guav © (2008-07-20 21:01) [21]> [19] Riply © (20.07.08 20:36)
> Угу - по отношению к первой половине фразы, ибо вторая еще
> пока сложна для моего восприятия :)
Первая половина:
size_t F() { return(42); };
const size_t i = 42; // статическая инициализация
const size_t j = F(); // динамическая инициализация
// или менее очевидный, но более жизненный пример:
const size_t k = _countof("Привет :)") - 1; // статическая инициализация
const size_t l = strlen("Привет :)"); // динамическая инициализация
// или с классами:struct X { int i; } x = {}; // статическая инициализация
// динамическая инициализация
struct Y {
Y() : i(0) {};
int i;
} y;
Вторая половина:
Нигде явно не писать длину, лишних обявлений, и т.п., нагрузив этим часть компилятора обрабатывающего дефайны.
> Под VS, как я поняла этот код работет ?
Да.
Можно ещё убрать скобки = { s }; - остались от варианта с шаблонами.
← →
AlexDan © (2008-07-20 21:27) [22]> имя (20.07.08 20:39) [20]
Хорошо хоть фамилию оставили).
← →
guav © (2008-07-20 21:32) [23]Динамическая инициализация, зато без единого дефайна:
struct unicode_string_t : UNICODE_STRING
{
unicode_string_t(const WCHAR* s, WORD len)
{
Length = len - 1;
MaximumLength = len;
if (Buffer = reinterpret_cast<WCHAR*>(_aligned_malloc(len, 1024)))
{
memcpy(Buffer, s, len * sizeof(WCHAR));
}
}
~unicode_string_t(void)
{
_aligned_free(Buffer);
}
};
template<size_t len>
UNICODE_STRING InitStr(const WCHAR (&s)[len])
{
static unicode_string_t v(s, len);
return v;
}
const UNICODE_STRING TestFile = InitStr(L"\\??\\E:\\Delete Files\\TestFile.txt");
int _tmain(int argc, _TCHAR* argv[])
{
wprintf(L"%p == %.*s", TestFile.Buffer, TestFile.Length, TestFile.Buffer);
return 0;
}
← →
guav © (2008-07-20 21:38) [24]Точнее, [23] конечно, работать не будет для нескольки строк одинаковой длины, но идея думаю понятна...
← →
Riply © (2008-07-20 21:43) [25]> [21] guav © (20.07.08 21:01)
> [23] guav © (20.07.08 21:32)
Спасибо !
P.S.
Уфф. Ты думаешь, я в состоянии переваривать все это с такой скоростью ?
Да я еще до сих пор вместо "==" настырно пытаюсь писать "=" :)
← →
guav © (2008-07-20 22:04) [26]> Да я еще до сих пор вместо "==" настырно пытаюсь писать "=" :)
Я тоже иногда :) пиши rvalue слева - не ошибёшься.
по [23] - что происходит внутри InitStr можешь не смотреть, оно всё равно не правильно, главное, что я хотел показать - InitStr возвращает UNICODE_STRING, которая инициализирует константу, и что есть static переменная с деструктором для последующего освобождения строки.
← →
Riply © (2008-07-20 22:39) [27]> [26] guav © (20.07.08 22:04)
Здорово !
Твоему DECLARE_RTL_CONSTANT_STRING глубоко плевать на всякие там CodeGuard`ы вместе с их "options",
знай выравнивает себе и в ус не дует :)
Страницы: 1 вся ветка
Текущий архив: 2008.09.07;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.016 c