从.h文件调用函数

时间:2014-09-11 21:02:52

标签: c function struct

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是否可以从file1.c调用函数
  • 如何将dp.startInt值传递给file2.h,以便在file1.c中的dp.startInt中设置的值10可以在file2.h的函数调用中使用?

需要从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;
}

2 个答案:

答案 0 :(得分:1)

您声称file2.h包含:

void function(void);

function1();

但这些行指的是两个不同的功能。
此问题现已解决;这两个名字都是function1

如果function1();出现在任何函数之外,它是(非常草率)函数声明,而不是函数调用。如果它在某个函数中,那么函数定义在头文件中执行的是什么。它需要具有inline功能才能具有很大的合法性。

以下问题现已解决;类型是一致的。
另外,你说:一个整数被赋予struct:dp[1].startInt = 10; 。编译器抱怨你不应该为指针分配整数(因为startInt被声明为指针,而不是int)。您需要在没有此类投诉的情况下编译代码。

... 定义了两个版本的结构,其中一个版本位于startIntunsigned 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?