Можно ли писать фигурные скобки в #define?
Нашел такой код:
#define OpenThen(hkey_key, lpcwstr_subkey, callback) { \
HKEY _k = 0; \
if (ERROR_SUCCESS != RegOpenKeyEx(hkey_key, lpcwstr_subkey, 0, KEY_ALL_ACCESS, &_k)) { \
printf("Failed to open key: %ws\\%ws\n\n", GetKeyPath(hkey_key), lpcwstr_subkey); \
} else { \
HKEY key = _k; \
callback; \
RegCloseKey(key); \
} \
}
OpenThen(HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\Scsi", {
ForEachSubkey(key, {
OpenThen(key, name, {
ForEachSubkey(key, {
OpenThen(key, name, {
ForEachSubkey(key, {
if (wcsstr(name, L"arget")) {
OpenThen(key, name, {
ForEachSubkey(key, {
SpoofUnique(key, name, L"Identifier");
});
});
}
});
});
});
});
});
});
Как работает момент с параметрами?
Получается параметры макроса это просто любые строки которые просто будут подставлены в токен?
Ответы (1 шт):
Можно ли писать фигурные скобки в #define?
да. в define можно писать почти все, что угодно (ну почти). Даже то, что на первый взгляд выглядит некомпилируемым.
Как работает момент с параметрами?
когда препроцессор видит define, он просто делает подмену. Ему абсолютно все равно, там обычная переменная, функция или шаблонно шаблонный параметр. Препроцессор этого не знает.
Можно попросить препроцессор сохранить вывод и посмотреть, что там. Так как у Вас работа с реестром, скорее всего это студия.
- правой кнопкой по имени проекта в солюшене и выбираем 'Properties'
- открываем вкладку 'Configuration Properties'
- открываем вкладку 'C/C++'
- кликаем на 'Preprocessor'
- меняем опцию 'Preprocess to a File' на 'Yes (/P)'
пересобираем проект и ищем файлы с расширением .i и там ищем нужную функцию. файлик будет не маленький, но можно найти по имени функции.
Я часто такое использую, что бы посмотреть, что получилось в результате, что бы отладить что то неоднозначное.