Правильный способ экспорта констант в API - PullRequest
2 голосов
/ 09 февраля 2012

Какое из двух решений, показанных в приведенном ниже примере, является правильным способом экспорта констант из моего API (Windows DLL) и почему это превосходная альтернатива?

Заголовочный файл

namespace ExampleAPI
{
    // Solution one
    extern const DWORD __declspec(dllexport) AKTION_OK;
    extern const DWORD __declspec(dllexport) AKTION_FEHLER;

    // Solution two
    const DWORD AKTION_FEHLER_DATENBANK = 2;
    const DWORD AKTION_FEHLER_XXX = 3;
}

Cpp файл

namespace ExampleAPI
{
    // Solution one
    const DWORD AKTION_OK = 0;
    const DWORD AKTION_FEHLER = 1;
}

Я думаю, что первое решение - лучшая альтернатива, потому что константы определяются только один раз в файле cpp, а не в каждом блоке ссылок, который включает файл заголовка. Поправьте меня если я ошибаюсь. Хотя ему не хватает читабельности ...

Ответы [ 2 ]

3 голосов
/ 09 февраля 2012

Я не рассматриваю эти решения как эквивалентные.

Один определяет постоянную времени компиляции, а другой - ссылку на постоянное значение. С точки зрения компиляторов они отличаются, когда речь заходит об оптимизации: например, (10+AKTION_FEHLER_DATENBANK) может оцениваться во время компиляции в случае решения 1, но не в случае решения 2.

Но есть более важные случаи, когда их нельзя использовать взаимозаменяемо, например: case AKTION_FEHLER_DATEBANK: допустимо в случае 1, но не в случае 2.

Аналогично для char Array[AKTION_FEHLER_DATEBANK].

3 голосов
/ 09 февраля 2012

Используя второе решение, компилятор узнает константы при компиляции приложения с использованием API.Это может позволить компилятору выполнять больше оптимизаций.

Преимущество первого решения состоит в том, что вы можете изменять константы без перекомпиляции приложения с помощью API.

...