2014-10-27 2 views
-2

Как получить доступ к элементу структуры в другом файле? есть в файл позволяет говорить 1.cpp и файле 2.cpp и я comiling как файл сразу, как GCC 1.cpp файле 2.cpp, но я получаю сообщение об ошибке, как показано нижеКак получить доступ к элементу структуры в другом файле?

1. warning: ‘struct st’ declared inside parameter list [enabled by default] 
2. warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default] 
3.dereferencing pointer to incomplete type 

, пожалуйста, помогите мне исправить мой код ниже

1.c

#include<stdio.h> 
struct st 
{ 
     int s; 
     char ch[20]; 
}; 
void fn(struct st *); 
int main() 
{ 
     struct st var={2,"pravu"}; 
     fn(&var); 
} 

2.c

#include<stdio.h> 
    void fn(struct st *p) 
{ 
    printf("%d\n",p->x); 
    printf("%s\n",p->ch); 
} 

Я компиляции в GCC 1.С 2.c?

ответ

2

Вам нужно поместить определение вашей структуры в файл заголовка. Таким образом, все файлы c/cpp будут использовать одно и то же определение; как это:

2.h

#ifndef 2_H_ 
#define 2_H_ 

struct st 
{ 
     int s; 
     char ch[20]; 
}; 
void fn(struct st *); 

#endif 

1.c

#include "2.h" 
#include<stdio.h> 
int main() 
{ 
     struct st var={2,"pravu"}; 
     fn(&var); 
} 

2.c

#include "2.h" 
void fn(struct st *p) 
{ 
    printf("%d\n",p->x); 
    printf("%s\n",p->ch); 
} 

EDIT: Заметьте, что я также переместили свой «опережающее объявление "функции fn(struct st *p) в файле заголовка. Это лучше, практика ...

EDIT2: Я принял во внимание замечания @JonathanLeffler

+0

спасибо вам много сэр –

+0

Обратите внимание, что (а) заголовок должен иметь охрану в нем, чтобы защитить его от нескольких включение, (b) заголовок не должен включать '', поскольку ни одно из объявлений в заголовке не зависит от declaratios от '' (но это изменилось бы, если, например, у вас был 'void ffn (FILE * fp, struct st * p); 'как объявление - тогда вам понадобится' #include '. Заголовки должны быть автономными и идемпотентными. Автономный означает, что если программе нужны услуги, объявленные заголовком, она включает в себя th e, и никакой другой заголовок не должен быть включен кодом, использующим его. _ [... продолжение ...] _ –

+0

_ [... продолжение ...] _ Idempotence означает, что заголовок может быть включен несколько раз, и компиляция не будет прерываться. Обычно это означает, что он защищен '#ifndef HEADER_H_INCLUDED' и' #define HEADER_H_INCLUDED' вверху и '#endif // HEADER_H_INCLUDED' внизу. Имя, выбранное для макроса, должно быть уникальным - некоторые используют UUID, например, но в остальном не критичны. –

Смежные вопросы