• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
    • Questions
    • Teachers
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

380
Views
¿Se puede aplicar la macro C offsetof() a las uniones?

A menudo se supone que offsetof() se puede aplicar a uniones (incluso puede encontrar tal uso en varias preguntas aquí en SO), pero, sin embargo, parece que todas las especificaciones de C desde C90 hasta hoy en día solo dicen que la macro offsetof() admite estructuras Ahora estaba echando un vistazo al libro "Modern C" de Jens Gustedt, y la tabla 4.3 especifica "struct" como el tipo del primer argumento para offsetof().

Entonces,... ¿los sindicatos están oficialmente respaldados por offsetof(), o no?

about 3 years ago · Santiago Trujillo
1 answers
Answer question

0

Esto es en realidad un defecto en la especificación C, hasta C2x. Esto se mencionó en un informe de defectos para la especificación C11 DR 496 , que se resolvió en C2x.

De la sección de especificaciones C11 §7.19 párrafo 3, la definición de offsetof :

offsetof(type, member-designator)

que se expande a una expresión constante entera que tiene tipo size_t , cuyo valor es el desplazamiento en bytes, al miembro de estructura (designado por miembro-designador ), desde el comienzo de su estructura (designado por tipo ). El designador de tipo y miembro debe ser tal que dado

static type t;

entonces la expresión &(t.member-designator) se evalúa como una constante de dirección. (Si el miembro especificado es un campo de bits, el comportamiento no está definido).

El argumento de tipo se describe como un "miembro de estructura", pero la expresión &(t.member-designator) también está bien definida para tipos de unión (§6.7.2.1 párrafo 16). Esto generó ambigüedad para los autores de compiladores, por lo que la mayoría optó por permitir la offsetof de uniones.

En la especificación C2x, esto se reformula (el énfasis en negrita es mío):

offsetof(type, member-designator)

que se expande a una expresión constante entera que tiene tipo size_t , cuyo valor es el desplazamiento en bytes, al subobjeto (designado por miembro-designador ), desde el comienzo de cualquier objeto de tipo type . El designador de tipo y miembro debe ser tal que dado

static type t;

entonces la expresión &(t.member-designator) se evalúa como una constante de dirección. Si el tipo especificado define un nuevo tipo o si el miembro especificado es un campo de bits, el comportamiento no está definido.

Siendo los cambios:

  • "miembro de estructura" -> "subobjeto"
  • "comienzo de su estructura" -> "comienzo de cualquier objeto de tipo tipo "
  • usar offsetof en nuevas declaraciones de tipo es un comportamiento indefinido

Para responder a la pregunta de "se puede aplicar offsetof a las uniones":

  • En C2x, sí
  • En versiones anteriores, probablemente también sí, dado que muchos compiladores lo admiten
about 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error