Удалить функцию во время компиляции, определив его как пустой макрос

голоса
5

В этом примере коде макро-либо определен или закомментирован программистом для того, чтобы удалить функцию из выпущенного программного обеспечения.

#include <stdio.h>

#define MACRO //or omitted

#ifdef MACRO
    void Function(const char* str)
    {
        printf(%s\n, str);
    }

#else
    #define Function(str)

#endif

int main(void)
{
    Function(hello world);
    getchar();
    return 0;
}

Что плохого в этом?

Задан 06/05/2017 в 20:07
пользователем
На других языках...                            


2 ответов

голоса
0

Это будет работать. Но весь символ удаляется таким образом. Я предпочитаю следующий метод.

#include <stdio.h>

#define MACRO    1

#if MACRO
    void Function(const char* str)
    {
        printf("%s\n", str);
    }

#else
    void Function(const char *str){}

#endif

int main(void)
{
    Function("hello world");
    getchar();
    return 0;
}

Следующие изменилось:

  • #ifТеперь сравнивает логическое значение. Ваш IDE теперь может найти , где MACROопределяется, во всех случаях. (правая кнопка мыши, найти определение)
  • Вы можете, изменив MACRO2, изменить весь смысл Function. Например, релиз составлен вариант может содержать печать в файл или системный журнал.
  • Там всегда будет символом Function, даже если он ничего не делает, даже в скомпилированный код. Это имеет то преимущество , что строковые литералы в аргументе еще рассчитывать на статистику размера. В качестве встроенного разработчика, я считаю , это важно.

Очевидно, что это отчасти предпочтение тому, кто Crafts код.

Ответил 06/05/2017 в 20:20
источник пользователем

голоса
0

Даже если ваше решение работает, я предпочитаю следующий подход:

#include <stdio.h>

#define MACRO //or omitted

#ifdef MACRO
#define FUNCTION(a) Function(a);
#else
#define FUNCTION(a)
#endif

#ifdef MACRO
    void Function(const char* str)
    {
        printf("%s\n", str);
    }
#endif

int main(void)
{
    FUNCTION("hello world")
    getchar();
    return 0;
}

Примечание : Функция макро, функция является фактическим именем функции

Это работает путем определения FUNCTION макросъемки (а) для вызова функции (Const символ *), когда MACRO включена. С другой стороны, когда MACRO отключен, вызов функции (а) будет определяться ни к чему.

Я предпочитаю этот метод, так как это было бы легче абстрагироваться от макро используется для определения вашего звонка из макроса, определяющего ваше определение функции. Вы, возможно, случаи, когда в режиме выпуска, нужно только, чтобы удалить некоторые из вызовов функции. В этом случае определение функции () по-прежнему требуется. Например:

#include <stdio.h>

#define DEBUG //or omitted

#ifdef DEBUG
#define FUNCTION(a) Function(a);
#else
#define FUNCTION(a)
#endif

void Function(const char* str)
{
    printf("%s\n", str);
}

int main(void)
{
    // Call function with Hello World only in debug
    FUNCTION("hello world")
    getchar();

    // Call function with goodbye world in both debug and release
    Function("goodbye world");
    return 0;
}
Ответил 06/05/2017 в 22:29
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more