O que são as: Sequências Especificadoras de Atributos em C++?

🎆 Importantes para: Detectar erros, Otimizar o código e Fornecer informações adicionais ao desenvolvedor.


O que são as: Sequências Especificadoras de Atributos em C++?


As Sequências Especificadoras de Atributos (Attribute Specifiers) em C++ são metadados que fornecem informações adicionais ao compilador sobre como ele deve tratar certas partes do código.

Esses atributos podem ajudar a:

  • Detectar erros;
  • Otimizar o código;
  • ou Fornecer informações adicionais ao desenvolvedor.

Vamos ver alguns exemplos de atributos em C++.


Exemplos de Atributos em C++

01. [[nodiscard]]:

Esse atributo indica que o valor de retorno de uma função não deve ser ignorado. Se o valor de retorno for ignorado, o compilador gerará um aviso.

[[nodiscard]] int computeValue() {
    return 42;
}

int main() {
    computeValue(); // Aviso do compilador: o valor de retorno foi ignorado
    int result = computeValue(); // Correto, o valor de retorno é usado
    return 0;
}

O compilador emitirá um aviso se a função computeValue for chamada e seu valor de retorno não for usado. Isso é útil para evitar a perda acidental de valores importantes.

Se você remover o [[nodiscard]] do código note que não haverá avisos, mas com o [[nodiscard]] a saída será similar a isso:

nodiscard.cpp: In function ‘int main()’:
nodiscard.cpp:8:17: warning: ignoring return value of ‘int computeValue()’, declared with attribute ‘nodiscard’ [-Wunused-result]
    8 |     computeValue(); // Aviso do compilador: o valor de retorno foi ignorado
      |     ~~~~~~~~~~~~^~
nodiscard.cpp:3:19: note: declared here
    3 | [[nodiscard]] int computeValue() {

02. [[fallthrough]]:

Esse atributo é usado em uma declaração case dentro de um switch para indicar que a queda (fallthrough) para o próximo case é intencional. Isso ajuda a evitar avisos do compilador sobre quedas acidentais.

void process(int value) {
    switch (value) {
        case 1:
            // Código para o case 1
            [[fallthrough]];
        case 2:
            // Código para o case 2
            break;
        default:
            // Código para outros casos
            break;
    }
}

No exemplo do switch, [[fallthrough]] indica que a queda de case 1 para case 2 é intencional. Sem esse atributo, o compilador poderia emitir um aviso sobre a falta de break em case 1.


03. [[unlikely]]:

Esse atributo sugere ao compilador que a probabilidade de execução de um ramo de código é baixa. Isso pode ajudar na otimização do código gerado.

#include <iostream>

void checkValue(int value) {
    if (value == 42) [[unlikely]] {
        std::cout << "O valor é 42, o que é improvável!\n";
    } else {
        std::cout << "O valor não é 42.\n";
    }
}

int main() {
    checkValue(10);
    checkValue(42);
    return 0;
}

O compilador pode otimizar o código gerado com base na dica de que a condição value == 42 é improvável de ser verdadeira, possivelmente reordenando o código para melhorar o desempenho no caso mais comum.


Esses atributos são parte da modernização contínua da linguagem C++ para tornar o código mais expressivo e ajudar na detecção precoce de erros, bem como na otimização de desempenho.

Para mais informações acesse o cpp reference.


cpp cppdaily


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!