Как передать указатель на структуру функции, которая описана в другом заголовке? - PullRequest
0 голосов
/ 27 марта 2020

Я объявил и определил структуру в отдельных файлах, и из основного я получаю к ним доступ без проблем, но когда я пытаюсь передать указатель на структуру в функциях, которые, в свою очередь, также объявлены и определены в других файлах, возникает проблема :

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 Я не буду описывать их снова, чтобы не увеличивать должности, они остались без изменений. Существует ли универсальный и правильный способ подключения к внешней стороне описываемой структуры с возможностью их использования в качестве указателя. Этот пример искусственно упрощен, чтобы было легче понять, что я хочу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...