file1.c
=>包括file1.h
file1.h
=>有一个struct
:
typedef struct {
unsigned char *start;
unsigned int startInt;
}debugPrint;
file1.c
=>创建一个struct
对象:
debugPrint dp;
file1.c
=> int
中有struct
:
dp.startInt = 10;
file1.c
=>有一个功能:
void function1(debugPrint dp) {
printf("%d", dp.startInt);
}
file2.h
=>有一个函数调用file1.
c函数,它在调用之前声明:
void function1(void);
function1();
问题是:
需要从file2.h调用它,因为这个文件处理html页面和file2.h文件=>之间的动态变量交换。来自file2.h的函数调用通过file1.c发送到Html页面。但我不会更多地进入html页面的传递变量,因为我不知道它是如何制作的。它是openPicus Web服务器示例的一种机制。
但是如果你知道一个很好的解决方案。我会很感激。我对这种代码并不熟悉,所以这也是一个问题:)
但是因为我觉得这个描述不够好,所以这里是文件:
file1.c中:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include "test1.h"
// Define printStruct
void printStruct (debugPrint dp) {
printf("%u", dp.startInt);
}
int main ()
{
dp.startInt = 10;
getch();
}
file1.h:
typedef struct {
// For the motorEncoder value
unsigned char filename[20];
char ownMsg[10];
unsigned char *start;
unsigned char *timeInSeconds;
unsigned char *distanceInCm;
unsigned char *numberOfShots;
unsigned char *shutterCompensation;
unsigned char *direction;
unsigned char *cancel;
unsigned char *dutyCycle;
unsigned int cancelInt;
unsigned int startInt;
unsigned int dutyCycleInt;
unsigned int directionInt;
}debugPrint;
// Create struct object called dp
debugPrint dp;
// declare printStruct
void printStruct (debugPrint dp);
file2.h :(这个文件完全需要传递动态值)我没有放任何包含因为我不确定我应该如何包含.h文件以及我应该包含它们的位置。
// Call printStruct function
printStruct(dp);
file2.h的一部分实际代码:(AND YES file2.h一个HEADER FILE)。对于我来说,这些功能首先被宣布,然后其中一个用于H FILE =&gt; HTTPPrint()函数来自一个名为HTTPPrint_stepCounter()的函数;叫做。然后在file1.c中定义该函数,它只是将一些动态数据打印到http页面。正如所说的那样openPicus已经完成了它,我只是想修改它。
void HTTPPrint(DWORD callbackID);
void HTTPPrint_led(WORD);
void HTTPPrint_stepCounter(void);
void HTTPPrint(DWORD callbackID)
{
switch(callbackID)
{
case 0x00000017:
HTTPPrint_led(0);
break;
case 0x00000059:
HTTPPrint_stepCounter();
break;
default:
// Output notification for undefined values
TCPPutROMArray(sktHTTP, (ROM BYTE*)"!DEF", 4);
}
return;
}
void HTTPPrint_(void)
{
TCPPut(sktHTTP, '~');
return;
}
答案 0 :(得分:1)
您声称 file2.h
包含:
void function(void);
function1();
但这些行指的是两个不同的功能。
此问题现已解决;这两个名字都是function1
如果function1();
出现在任何函数之外,它是(非常草率)函数声明,而不是函数调用。如果它在某个函数中,那么函数定义在头文件中执行的是什么。它需要具有inline
功能才能具有很大的合法性。
以下问题现已解决;类型是一致的。
另外,你说:一个整数被赋予struct: dp[1].startInt = 10;
。编译器抱怨你不应该为指针分配整数(因为startInt
被声明为指针,而不是int
)。您需要在没有此类投诉的情况下编译代码。
... 定义了两个版本的结构,其中一个版本位于 startInt
为unsigned int *startInt;
的问题顶部,另一个版本位于声明是unsigned int startInt
。请让你的问题自我一致! ......
此问题现已解决; dp
是一个简单的结构。
另请注意,您创建了 debugPrint dp[1];
,因此您的初始化会超出界限;数组的最大有效索引为0。
如果file2.c
中的代码需要访问file1.h
中声明的结构类型的内部,则标题file1.h
应包含在file2.c
中。您也可以在标题中声明dp
数组。仅当标头定义的函数公开其他标头中定义的类型时,标头才应包含其他标头。例如,如果file1.h
中定义的结构包含FILE *db_fp;
元素,则file1.h
应该#include <stdio.h>
以确保file1.h
中的代码无论编写什么都会编译否则使用file1.h
的代码包括。
答案 1 :(得分:1)
C语言新手的一些提示:
定义与声明之间存在重要差异。
定义是实际创建函数或变量的内容。每个函数必须只定义一次。在* .c源文件中或在库中。
声明在符号表中创建一个条目,表示函数或变量存在......某处......以及此处的数据类型。声明可以复制而不会产生任何影响。
我们将函数定义放在* .c源文件中。 (还有在图书馆,但这是一个高级构建主题......)
我们将公共或extern
函数声明放在* .h头文件中。
我们在* .h头文件中放置了共享extern
变量声明,以便其他源单元可以共享同一个变量。
我们在* .h头文件中放置了共享typedef
结构声明,以便其他源单元可以共享相同的数据类型。
我们不会在* .h标头文件中放置变量声明,如果它们不是extern
,或者它们是初始化的。初始值属于* .c文件。
函数定义通常不属于* .h头文件,因为它可能在大型项目中可以包含头文件(由编译器读取)多次。这会导致编译器错误,因为那时函数会有多个定义。即使它实际上是相同源代码的重复,也只能有一个。
有关file1.h函数调用的file2.h的引用不正确,function1();
可以是声明或函数调用,具体取决于上下文:
// declaration of a function named foo
void foo(void);
//
// declaration of a function named bar
// equivalent to declaring void bar(void);
bar();
//
// definition of a function named foo
void foo(void)
{
// call (or invoke) the function named bar
bar();
}
关于数组的另一个小问题:声明一个元素debugPrint dp[1]
的数组非常奇怪,因为该声明创建了一个将被称为dp[0]
的对象。这让我觉得你可能试图避免使用指针...只是声明debugPrint dp
然后该对象被称为dp
会更直接。如果您有多个相同类型的相关对象,则数组是有意义的,但对于一个对象,它是一种非常不寻常的用法。
C是一种非常灵活的编程语言,可以免费访问许多低级技巧。无论是祝福还是诅咒......对于刚开始使用该语言的人来说,尽可能多地阅读其他人的代码示例非常重要,以帮助了解事情通常是如何完成的。有很多非常聪明的方法可以使用这种语言(例如Duff的设备),但在大多数情况下,你最好坚持使用解决问题的最简单和习惯的方式。
另请参阅:What is the difference between a definition and a declaration?