Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

207
Visualizações
¿Cómo superar la dependencia circular mientras se oculta la información de la estructura al mismo tiempo en C?

Como puede ver, quiero separar lógicamente la tabla de la implementación del cursor. Además, quiero ocultar al usuario la información de la tabla y del cursor. Sin embargo, hacerlo generará el siguiente error del compilador

./table.h:10:1: error: unknown type name 'Cursor'

La solución alternativa es reenviar la declaración de estructura o colocar la declaración de estructura en los archivos de encabezado. Pero NO son muy elegantes.

O simplemente no sé cómo usar la declaración directa de una manera "mejor".

¿Hay alguna otra manera de lograr lo que estoy tratando de hacer aquí?

Cualquier ayuda será apreciada.

cursor.h

 #ifndef CURSOR_H #define CURSOR_H #include "table.h" typedef struct Cursor_t Cursor; //struct data hiding //struct Table; //alternative solution: forward declaration //struct Table* cursor_get_table(Cursor* cursor); Table* cursor_get_table(Cursor* cursor); #endif

cursor.c

 #include "cursor.h" typedef struct Cursor_t { Table* table; } Cursor; //struct Table* cursor_get_table(Cursor* cursor) { //alternative solution Table* cursor_get_table(Cursor* cursor) { return cursor->table; //warning: incompatible pointer types returning 'Table *'... }

mesa.h

 #ifndef TABLE_H #define TABLE_H #include "cursor.h" typedef struct Table_t Table; //struct data hiding //struct Cursor; //alternative solution: forward declaration //struct Cursor* table_start(Table* table); Cursor* table_start(Table* table); //error: unknown type name 'Cursor' #endif

mesa.c

 #include "table.h" typedef struct Table_t { } Table; //struct Cursor* table_start(Table* table) { //alternative solution Cursor* table_start(Table* table) { return 0; }

C Principal

 #include <stdio.h> #include "cursor.h" #include "table.h" int main() { Table* table; Cursor* cursor; printf("hello world\n"); return 0; }

Tenga en cuenta que main.c es solo un código de prueba. No estoy tratando de lograr nada significativo aquí.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Tiene una dependencia circular en sus archivos de encabezado, por lo que solo uno de ellos se incluye en el otro, según el archivo que esté compilando.

Ambos archivos de encabezado necesitan ver la declaración directa del tipo del otro, así que cree un tercer encabezado con los tipos e inclúyalo en los encabezados existentes.

tipos.h

 #ifndef TYPES_H #define TYPES_H typedef struct Cursor_t Cursor; typedef struct Table_t Table; #endif

cursor.h

 #ifndef CURSOR_H #define CURSOR_H #include "types.h" Table* cursor_get_table(Cursor* cursor); #endif

tabla.h:

 #ifndef TABLE_H #define TABLE_H #include "types.h" Cursor* table_start(Table* table); #endif

Sus archivos .c tendrían las definiciones de estructura, pero sin el typedef ya que ya existe.

over 4 years ago · Santiago Trujillo Relatório

0

Las declaraciones de estructura directa con el uso de punteros también son una forma de ocultar datos. cursor.c no podría tener acceso a Table interna y contener la definición del Cursor .

Esto permite cambios en la implementación sin volver a compilar los usos (mediante un archivo MAKE).

Es posible que necesite funciones solo entre cursor.c y table.c, pero eso podría incluso colocarse en un cursor_table.h o cualquier estilo que desee. Existen "clases" estrechamente acopladas.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda