Retirar uma função durante a compilação definindo-o como um macro vazio

votos
5

Neste código exemplo uma macro está quer definido ou comentada pelo programador, de modo a remover uma função do software lançado.

#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;
}

Há algo de errado com isso?

Publicado 06/05/2017 em 20:07
usuário
Em outras línguas...                            


2 respostas

votos
0

Vai funcionar. Mas o símbolo inteiro é removido dessa maneira. Eu prefiro o método a seguir.

#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;
}

O seguinte mudou:

  • O #ifagora compara um boolean. O IDE é agora capaz de encontrar onde MACROé definido, em todos os casos. (clique direito, encontrar definição)
  • Você pode, alterando MACROa 2, mudar todo o significado Function. Por exemplo, uma variante liberação compilado pode conter uma cópia para arquivo ou log do sistema.
  • Haverá sempre um símbolo para Function, mesmo que ele não faz nada, mesmo em código compilado. Isto tem a vantagem de que as strings literais no argumento ainda contam para as estatísticas de tamanho. Como um desenvolvedor incorporado, eu acho isso importante.

Obviamente, isto é, em parte, a preferência de quem artesanato do código.

Respondeu 06/05/2017 em 20:20
fonte usuário

votos
0

Mesmo que a sua solução funciona, eu prefiro a seguinte abordagem:

#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;
}

Nota : função é a macro, a função é o nome real da função

Isso funciona, definindo a função macro (a) para uma chamada para a função (const char *) quando MACRO está habilitado. Por outro lado, quando MACRO está desativado, as chamadas para FUNÇÃO (a) será definida a nada.

I tendem a preferir este método, uma vez que seria mais fácil abstrair da macro usada para definir a sua chamada da macro definir sua definição de função. Você pode ter casos em que no modo de versão você só precisa remover algumas das chamadas de função. Nesse caso, ainda é necessária a definição de função (). Por exemplo:

#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;
}
Respondeu 06/05/2017 em 22:29
fonte usuário

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