Я объявил и определил структуру в отдельных файлах, и из основного я получаю к ним доступ без проблем, но когда я пытаюсь передать указатель на структуру в функциях, которые, в свою очередь, также объявлены и определены в других файлах, возникает проблема :
In file included from func.c:1: func.h:4:22: warning: ‘struct StrA’ declared inside parameter list will not be visible outside of this definition or declaration
4 | void func(struct StrA *usrSet);
| ^~~~ func.c:5:6: error: conflicting types for ‘func’
5 | void func(struct StrA *usrSet){
| ^~~~ In file included from func.c:1: func.h:4:10: note: previous declaration of ‘func’ was here
4 | void func(struct StrA *usrSet);
| ^~~~
Вот код рабочего примера:
//main.c
//------------------
#include <stdio.h>
#include "str.h"
#include "func.h"
int main(int argc, char const *argv[]){
myStr.a = 4;
myStr.b = 3;
printf("%d %d\n", myStr.a, myStr.b);
return 0;
}
//str.h
//-------------------------------
#ifndef STR_H
#define STR_H
struct StrA
{
int a;
int b;
};
extern struct StrA myStr;
#endif
//str.c
//----------------
#include "str.h"
struct StrA myStr;
Но если вы добавите функцию (также описанную в другом блоке) и попытаетесь передать ей указатель на Структура в качестве аргумента, мы получим ошибку, описанную выше.
//main.c
//-----------------
#include <stdio.h>
#include "str.h"
#include "func.h"
int main(int argc, char const *argv[])
{
func(&myStr);
printf("%d %d\n", myStr.a, myStr.b);
return 0;
}
//func.h
//-----------------
#ifndef FUNC
#define FUNC
void func(struct StrA *usrSet);
#endif
//func.c
//----------------
#include "func.h"
#include "str.h"
struct StrA myStr;
void func(struct StrA *usrSet){
myStr.a = 1;
myStr.b = 9;
}
Все они включают взаимно связанные. str.h и str. c Я не буду описывать их снова, чтобы не увеличивать должности, они остались без изменений. Существует ли универсальный и правильный способ подключения к внешней стороне описываемой структуры с возможностью их использования в качестве указателя. Этот пример искусственно упрощен, чтобы было легче понять, что я хочу.