Могут / должны C++ #pragma препроцессоры находиться в функциях

Короче говоря, я хочу сделать функцию, которая встраивает визуальные стили манифеста и ссылки на ComCtl32.lib, версия 6, если доступна. Вот в основном то, что я надеюсь сделать:

void InitVivify() {
    // Embed visual style XML manifest
    #pragma comment(linker,                           \
        "\"/manifestdependency:type='Win32'"          \
        "   name='Microsoft.Windows.Common-Controls'" \
        "   version='6.0.0.0'"                        \
        "   processorArchitecture='*'"                \
        "   publicKeyToken='6595b64144ccf1df'"        \
        "   language='*'\""                           \
    )

    // Link common controls library
    #pragma comment(lib, "ComCtl32.lib")

    // Initialize controls used
    INITCOMMONCONTROLSEX InitCtrlEx;
    InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
    InitCtrlEx.dwICC = ICC_LISTVIEW_CLASSES | ICC_TAB_CLASSES | ICC_USEREX_CLASSES;
    InitCommonControlsEx(&InitCtrlEx);
}

Я понимаю, что это, вероятно, не очень хорошая практика, но так ли это?

1 ответ

Решение

Директивы Pragma - это директивы препроцессора.
Они заставляют реализацию вести себя определенным образом.
Так что это действительно, но не поощряется.

Стандарт C++11:

16.6 Прагма директива [cpp.pragma]

1 Директива предварительной обработки вида

# pragma pp-tokensopt new-line

заставляет реализацию вести себя в зависимости от реализации. Такое поведение может привести к сбою перевода или к тому, что переводчик или получающаяся программа будут вести себя не соответствующим образом. Любая прагма, которая не распознается реализацией, игнорируется.

Другие вопросы по тегам