C 在哪里声明结构

C 在哪里声明结构,c,function,struct,header-files,declaration,C,Function,Struct,Header Files,Declaration,我已经制作了3个文件来组织我的代码。A main.c、A functions.h和A functions.c。我还制作了一个用于某些函数的结构,我遇到了一个问题,我无法找到任何方法来声明使用.h文件中的结构的函数。它工作的唯一方式是,我将函数和结构放在.c中,而不在.h中声明任何函数 我试过这个 总的来说: #include "functions.c" 在.c中: #include "functions.h" void myfunction(sinWave *sw, float u, floa

我已经制作了3个文件来组织我的代码。A main.c、A functions.h和A functions.c。我还制作了一个用于某些函数的结构,我遇到了一个问题,我无法找到任何方法来声明使用.h文件中的结构的函数。它工作的唯一方式是,我将函数和结构放在.c中,而不在.h中声明任何函数

我试过这个

总的来说:

#include "functions.c"
在.c中:

#include "functions.h"
void myfunction(sinWave *sw, float u, float ts){
};

typedef struct{
   float amplitude;
   float fase;
} sinWave;
在.h中:

typedef struct sinWave;

void myfunction(sinWave *, float, float);
但它不起作用。我得到:

warning: useless storage class specifier in empty declaration
'typedef struct sinWave;'a

unknown type name 'sinWave'
'void ePLL(sinWave , float , float);'
不包含.c,是非常糟糕的样式,请在标题中显示它

在函数h中:

在功能c中:

总而言之,c:

不包含.c,是非常糟糕的样式,请在标题中显示它

在函数h中:

在功能c中:

总而言之,c:

这样比较好:

主要条款c:

职能.h:

职能c:

假设您将使用sin、cos等进行构建:

这样比较好:

主要条款c:

职能.h:

职能c:

假设您将使用sin、cos等进行构建:


按照正常的方式来做:

// functions.h
// type declaration
typedef struct { . . . } sinWave;

// function prototype
void myfunction(sinWave *, float, float);


按照正常的方式来做:

// functions.h
// type declaration
typedef struct { . . . } sinWave;

// function prototype
void myfunction(sinWave *, float, float);

结构正弦波;不声明类型。它引入了sinWave作为结构标签。标记本身不是类型名称;它使struct sinWave成为一种类型,而不是sinWave本身。在C++中,它会使SnWoW成为一种类型。 要解决此问题,您需要进行两个更改。在functions.h中,将sinWave声明为结构sinWave的别名类型:

在functions.c中,插入带有标记的结构定义:

struct sinWave
{
   float amplitude;
   float fase;
};
您可能还需要正确拼写阶段

请注意,function.c中已经有了结构定义:

typedef struct{
   float amplitude;
   float fase;
} sinWave;
这有两个问题。一个是在一个翻译单元中定义了标记的结构与在另一个翻译单元中定义了没有标记的结构不兼容。您需要使用一个标记来标识typedef给哪个结构命名,或者您可以在function.h中使用typedef提供结构的完整定义,但由于其他原因,这是一个不可取的解决方案

另一个问题是此定义出现在myfunction之后,但myfunction可能需要结构的定义,因此该定义必须出现在myfunction之前。

typedef struct sinWave;不声明类型。它引入了sinWave作为结构标签。标记本身不是类型名称;它使struct sinWave成为一种类型,而不是sinWave本身。在C++中,它会使SnWoW成为一种类型。 要解决此问题,您需要进行两个更改。在functions.h中,将sinWave声明为结构sinWave的别名类型:

在functions.c中,插入带有标记的结构定义:

struct sinWave
{
   float amplitude;
   float fase;
};
您可能还需要正确拼写阶段

请注意,function.c中已经有了结构定义:

typedef struct{
   float amplitude;
   float fase;
} sinWave;
这有两个问题。一个是在一个翻译单元中定义了标记的结构与在另一个翻译单元中定义了没有标记的结构不兼容。您需要使用一个标记来标识typedef给哪个结构命名,或者您可以在function.h中使用typedef提供结构的完整定义,但由于其他原因,这是一个不可取的解决方案


另一个问题是此定义出现在myfunction之后,但myfunction可能需要结构的定义,因此定义必须出现在myfunction之前。

将include与.c文件一起使用很少是正确的。通常只包含.h文件。可能有一些特殊情况需要以不寻常的方式执行操作,但这不是其中之一。将结构声明和函数原型放在.h文件中,将函数定义放在.c文件中,其中包括.h。此外,您可能希望使用double而不是float,除非您有充分的理由不这样做。您在Linux、Windows还是。。。?什么构建系统生成文件、SCON、Visual Studio IDE或。。。?还是在命令行手动调用编译器?最重要的是?这里的所有答案都假设您使用的是构建系统。例如,如果您只是从命令行调用GCC并指定单个.c文件,然后运行生成的a.out或a.exe程序,那么您需要开始使用一个生成系统,该系统将多个对象文件链接到单个可执行文件中。在没有构建系统的情况下,你也可以从命令行执行同样的操作,但是构建系统更好。Lee Daniel,我将把它放在带有32位CPU的esp32上,我还做了另一个实验,在这种情况下,双精度对我没有帮助。我在windows上,只编译gcc main.c-o main.exe。在.c文件中使用include很少是正确的。通常只包含.h文件。可能有一些特殊情况需要以不寻常的方式执行操作,但这不是其中之一。将结构声明和函数prot

.h文件中的类型,以及.c文件中的函数定义,其中包括.h。此外,您可能希望使用double而不是float,除非您有充分的理由不这样做。您在Linux、Windows还是。。。?什么构建系统生成文件、SCON、Visual Studio IDE或。。。?还是在命令行手动调用编译器?最重要的是?这里的所有答案都假设您使用的是构建系统。例如,如果您只是从命令行调用GCC并指定单个.c文件,然后运行生成的a.out或a.exe程序,那么您需要开始使用一个生成系统,该系统将多个对象文件链接到单个可执行文件中。在没有构建系统的情况下,你也可以从命令行执行同样的操作,但是构建系统更好。Lee Daniel,我将把它放在带有32位CPU的esp32上,我还做了另一个实验,在这种情况下,双精度对我没有帮助。我在windows上,只编译gcc main。c-o main.exetypedef本身解决不了任何问题,尽管它在这里也不会引起任何特别的麻烦。正向声明结构类型可能无法满足OP的需要,特别是没有按照此答案所示进行定位。@JohnBollinger。。。OP也使用了typedef,这就是为什么a使用typedef的原因,问题是函数原型中的sinWave是未知的,这是一种使其可见的方法,答案有什么问题?问题是,无论需要知道其大小还是需要访问其成员,类型struct sinWave的定义都需要在范围内。如果作用域中只有一个转发声明,那么它是一个不完整的类型。在您的示例代码中,由于其位置的原因,struct sinWave的定义仅适用于以下分号,OP不需要知道大小是否适合使用不完整的类型如果他想声明该类型的对象,以便将指向该对象的指针作为参数传递给函数,他需要知道大小。如果要访问结构成员,函数的作用域也需要一个完整的类型,这似乎是它的意图。typedef本身解决不了任何问题,尽管它在这里也不会引起任何特别的麻烦。正向声明结构类型可能无法满足OP的需要,特别是没有按照此答案所示进行定位。@JohnBollinger。。。OP也使用了typedef,这就是为什么a使用typedef的原因,问题是函数原型中的sinWave是未知的,这是一种使其可见的方法,答案有什么问题?问题是,无论需要知道其大小还是需要访问其成员,类型struct sinWave的定义都需要在范围内。如果作用域中只有一个转发声明,那么它是一个不完整的类型。在您的示例代码中,由于其位置的原因,struct sinWave的定义仅适用于以下分号,OP不需要知道大小是否适合使用不完整的类型如果他想声明该类型的对象,以便将指向该对象的指针作为参数传递给函数,他需要知道大小。如果要访问结构成员,函数也需要一个完整的范围类型,这似乎是它的意图。将结构的定义放在functions.h中会将其暴露给main.c和其他翻译单元,如果其他翻译单元不需要知道其内容,这通常是不可取的。最好用一个标记来标识它,并将完整的定义隔离到函数中。h.是的,我们需要更多地了解main来进行调用。问题中的原始代码并不试图定义函数中的结构。h,只需参考它,因此解决方案不应添加此未请求的公开。@EricPostChil,从他们的掌握程度来看,OP的意图似乎不太可能是使用不透明的结构类型。虽然我们不能确定,但将结构的定义放入函数.h中,从而将其暴露于main中,正是我所预期的为OP可能的预期用途服务所需要的。@GabrielMachado一句俗语:优秀的开发人员不会犯错误,因为他们已经犯了所有错误。如果你喜欢你所做的,并且认为隐藏一些结构、功能等会很好。在这里询问,他们会有很多建议!将结构的定义放在functions.h中会将其暴露给main.c和其他翻译单元,如果其他翻译单元不需要知道其内容,这通常是不可取的。最好用一个标记来标识它,并将完整的定义隔离到函数中。h.是的,我们需要更多地了解main来进行调用。问题中的原始代码并不试图定义函数中的结构。h,只需参考它,因此解决方案不应添加此未请求的公开。@EricPostChil,从他们的掌握程度来看,OP的意图似乎不太可能是使用
不透明结构类型。虽然我们不能确定,但将结构的定义放入函数.h中,从而将其暴露于main中,正是我所预期的为OP可能的预期用途服务所需要的。@GabrielMachado一句俗语:优秀的开发人员不会犯错误,因为他们已经犯了所有错误。如果你喜欢你所做的,并且认为隐藏一些结构、功能等会很好。在这里询问,他们会有很多建议!将结构的定义放在functions.h中会将其暴露给main.c和其他翻译单元,如果其他翻译单元不需要知道其内容,这通常是不可取的。最好用一个标记来标识它,并将完整的定义隔离到functions.h.True。在C语言中,这仍然是一种正常的方法,它更多的是性能,而不是像信息隐藏这样的细节。在不定义结构的情况下声明指向结构的指针是完全正常的。把它定义为“正常”并不能让它成为首选。OP显示了未公开定义且未请求公开定义的代码,因此不应在解决方案中添加公开定义。将结构的定义放入functions.h中,将其公开给main.c和其他翻译单元,如果其他翻译单位不需要知道它的内容,这通常是不可取的。最好用一个标记来标识它,并将完整的定义隔离到functions.h.True。在C语言中,这仍然是一种正常的方法,它更多的是性能,而不是像信息隐藏这样的细节。在不定义结构的情况下声明指向结构的指针是完全正常的。把它定义为“正常”并不能让它成为首选。OP显示的代码没有公开定义,也没有请求公开定义,因此不应该在解决方案中添加公开定义。我来自巴西,fase和Amplificate是葡萄牙语单词。我知道如果我想写专业代码的话,我应该停止混合这样的词。谢谢你的建议。我来自巴西,法斯和波幅是葡萄牙语。我知道如果我想写专业代码的话,我应该停止混合这样的词。谢谢你的建议。
gcc -o xyz main.c functions.c -lm
// functions.h
// type declaration
typedef struct { . . . } sinWave;

// function prototype
void myfunction(sinWave *, float, float);
// functions.c
#include "functions.h"

void myfunction(sinWave *sw, float u, float ts) {
   // function definition here
}
typedef struct sinWave sinWave;
struct sinWave
{
   float amplitude;
   float fase;
};
typedef struct{
   float amplitude;
   float fase;
} sinWave;