Можно ли писать фигурные скобки в #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 шт):

Автор решения: KoVadim

Можно ли писать фигурные скобки в #define?

да. в define можно писать почти все, что угодно (ну почти). Даже то, что на первый взгляд выглядит некомпилируемым.

Как работает момент с параметрами?

когда препроцессор видит define, он просто делает подмену. Ему абсолютно все равно, там обычная переменная, функция или шаблонно шаблонный параметр. Препроцессор этого не знает.

Можно попросить препроцессор сохранить вывод и посмотреть, что там. Так как у Вас работа с реестром, скорее всего это студия.

  • правой кнопкой по имени проекта в солюшене и выбираем 'Properties'
  • открываем вкладку 'Configuration Properties'
  • открываем вкладку 'C/C++'
  • кликаем на 'Preprocessor'
  • меняем опцию 'Preprocess to a File' на 'Yes (/P)'

пересобираем проект и ищем файлы с расширением .i и там ищем нужную функцию. файлик будет не маленький, но можно найти по имени функции.

Я часто такое использую, что бы посмотреть, что получилось в результате, что бы отладить что то неоднозначное.

→ Ссылка