Pergunta

Alguns afirma são caros, alguns são melhores desligado no código de produção. Pelo menos não está claro que as afirmações devem ser sempre ativada.

Na minha aplicação eu gostaria de ser capaz de ligar / desligar a parte de afirmações sobre base por arquivo ou por classe.

Como fazê-lo em C ++?

Foi útil?

Solução

para desativar afirma módulo de largura eu usaria:

#if defined(assert)
#  undef assert
#  define assert(x) ((void)0)
#endif

... é claro que isso pode ser simplificado se você está bem com o uso de uma macro personalizada.

#if defined(_NO_ASSERTS)
#  define myAssert(x) ((void)0)
#else
#  define myAssert(x) assert(x)
#endif

Para toda a classe de desativação eu usaria um membro da classe const estático ou um enum ampla classe em combinação com uma macro personalizada:

#define myAssert(x) do { if(_CLASS_ASSERT) { assert(x); } } while(0)

class AssertOff
{
  enum { _CLASS_ASSERT = 0 }
}

Com enums e bools static const todos os compiladores modernos deve otimizar afastado o if(_CLASS_ASSERT) {}.

Outras dicas

Para código com afirmações considera bom estilo de codificação.

Quanto tempo de execução ligar / desligar Você pode fazer isso com booleano variável. Por exemplo, em seu código, você pode fazer o seguinte:

Defina uma variável que será usada para indicar se as afirmações são ligados ou desligados em um namespace global (por exemplo, fora de sua função main () no mesmo arquivo).

bool  turnOnAssertions;

Definir uma variável como escrito abaixo em outros arquivos que você deseja ativar / desativar suas afirmações:

extern bool turnOnAssertions; 

Assim, manipulando a variável turnOnAssertions com a interface do usuário e escrever

if(turnOnAssertions)
assert(…);

Você pode ligar / desligar alguns de vocês afirmações!

Quanto tempo de compilação que você deve fazer o seguinte:

Para você compilador que você deve dar uma bandeira como -DASSERTIONSON (-Dflag_name [nome da bandeira você pode definir o que quiser])

#ifdef ASSERTIONSON 
bool turnOnAssertions = true;
#else
bool turnOnAssertions = false;
#endif

E é só usar a variável.

Boa sorte!

Para desativar asserções para um arquivo C ++, você poderia fazer um dos seguintes procedimentos:

  • Definir a constante NDEBUG perto do topo do arquivo de origem.
  • Adicione o -DNDEBUG para as opções de compilação para o arquivo de origem.

A maioria das IDEs e / ou infra-estrutura de construção permitem especificar opções de construção por arquivo, por isso esta é uma solução fácil.

Desligar afirmações em uma base por classe é mais difícil quando várias classes são misturados no mesmo arquivo de origem, ou você tem um monte de funções embutidas em seus arquivos de cabeçalho. Você pode, #define NDEBUG curso e #undef NDEBUG nos lugares relevantes.

Uma vez que algumas IDEs esperar para ser capaz de NDEBUG conjunto para não-compilações de depuração, você pode torná-lo mais extensível, por escolher o seu próprio nome de macro, como DISABLE_ASSERT. Em seguida, incluir código como como o seguinte em um arquivo comum cabeçalho (que não é pré-compilado):

 #ifdef DISABLE_ASSERT
 #define NDEBUG
 #endif
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top