AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77031930
Accepted
SRobertJames
SRobertJames
Asked: 2023-09-03 18:43:47 +0800 CST2023-09-03 18:43:47 +0800 CST 2023-09-03 18:43:47 +0800 CST

Os parênteses são necessários quando uma definição define algo como um número inteiro?

  • 772

Em C, sabe-se que #defineas macros devem usar parênteses. Veja, por exemplo , macros C e uso de argumentos entre parênteses .

No entanto, em código incorporado, frequentemente vejo isso sendo usado mesmo com inteiros . Por exemplo:

#define OFFSET (0x100)

Qual é o sentido dos parênteses quando a macro é simplesmente um número inteiro constante? Em que caso eles poderiam fazer a diferença?

c
  • 2 2 respostas
  • 73 Views

2 respostas

  • Voted
  1. Best Answer
    chqrlie
    2023-09-03T19:27:03+08:002023-09-03T19:27:03+08:00

    A menos que sejam usadas em construções específicas, as macros devem se expandir para uma única expressão primária ou uma única instrução sem o ponto e vírgula final. A razão para isso é evitar problemas de precedência do operador quando a macro é invocada como parte de uma expressão ou como uma instrução em uma instrução composta.

    Colocar a expansão entre parênteses é uma maneira simples de garantir que a expansão seja uma expressão primária. No entanto, como você notou, constantes numéricas e literais de string não requerem o conjunto de parênteses para essa finalidade.

    Observe, entretanto, que os parênteses são recomendados para números negativos, que são expressões, não constantes numéricas, como em

    #define EOF  (-1)
    

    Portanto, usar parênteses para números positivos e negativos pode ser uma questão de consistência.

    O exemplo postado parece ser o caso de um ou uma combinação destes:

    • regras de codificação desnecessariamente rígidas: sempre use parênteses
    • programador excessivamente cauteloso: em caso de dúvida, use parênteses
    • consistência e clareza para o próximo leitor, embora no seu caso tenha gerado mais perguntas

    Os parênteses extras não fazem diferença na maioria dos casos. No entanto, eles terão alguns efeitos colaterais em casos extremos que, de qualquer maneira, são erros ou horrores:

    • func OFFSETirá compilar para uma chamada de função funccom um único argumento0x100
    • os parênteses impedirão a colagem do token (a ser evitado de qualquer maneira):
    #define MAKE_LONG(n)  n##L
    long var1 = MAKE_LONG(100);      // expands to 100L, a long constant
    long var2 = MAKE_LONG(OFFSET);   // expands to (0x100)L, an invalid token error
    

    Mais importante ainda, os argumentos macro devem sempre estar entre parênteses, exceto possivelmente quando usados ​​como argumentos de função ou macro na expansão.

    • 4
  2. ldn
    2023-09-03T19:12:16+08:002023-09-03T19:12:16+08:00

    Qual é o sentido dos parênteses quando a macro é simplesmente um número inteiro constante?

    Acho que é para maior clareza, torna o código mais explícito e mais fácil de entender para outros desenvolvedores quando inclui parênteses.

    além disso, também depende do estilo de codificação do desenvolvedor que está familiarizado.

    é bom usar parênteses em macros, mesmo ao definir valores inteiros constantes.

    esta prática pode ajudá-lo a evitar problemas sutis e/ou tornar seu código mais fácil de manter/legível

    As questões sutis são como:

    • Evite efeitos colaterais inesperados
    • operador precedente
    • Digite Segurança
    • ...

    Em que caso eles poderiam fazer a diferença?

    na minha experiência, talvez seja NÃO.

    • 0

relate perguntas

  • Multiplicação mais rápida que *

  • Usando uma macro para comprimento de string no especificador de formato scanf () em C

  • Como você pode definir o tipo de dados de #define para long double?

  • Ponteiros const incompatíveis

  • Mudança de cor não gradual no OpenGL

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve