关于在C中使用同一程序的不同文件的困惑

时间:2014-10-20 22:32:08

标签: c compilation

当涉及到C和不同的文件(我习惯使用Java)时,我很难理解一些概念。 F.ex.在我有main的文件中,我需要使用另一个.c文件,其中包含运行我的程序所需的代码。我已经包含了这个文件,但我已经读过这个不推荐。包含另一个.c文件的正确方法是什么?

另外,我的代码很长(超过1000行),所以我想拆分成单独的文件,以便于阅读。我该怎么做呢?我当然已经找到了答案,但我仍然无法理解。

2 个答案:

答案 0 :(得分:0)

尽管未指定文件的最大长度,但长度超过1000行的文件不再可管理。

标题文件.h和程序文件.c

在编译和预处理之前,头文件包含在其他文件中。一个或多个程序使用的声明和定义位于头文件中。

头文件的主要目的是为编译器提供必要的信息,以验证实际和形式参数类型的重合以及结果的返回类型。

头文件中的变量声明证明了程序文件之间的分发代码失败。

不允许嵌套头文件。在头文件的开头必须使用指令#include显式指定操作此文件所需的所有文件。

一个好的做法是使用以下构造来防止多个包含相同的h文件:

#ifndef EXAMPLE_H
#define EXAMPLE_H
 ...    /* body of example.h file */
#endif /* EXAMPLE_H */

程序文件包含所有#definetypedef,变量声明,函数等。

因此,您的项目中将同时包含example.hexample.c

您可以将其分为myString.hmyString.c用于字符串函数,myFile.hmyFile.c用于处理文件操作等的程序的一部分。


作为使用头文件的示例,我可以显示以下代码(每个文件上面的注释都不是必需的,但被认为是一种很好的做法,因此其他程序员更容易理解您的代码):

/************************************************************************
*file: main.c
*synopsis: -
*author: Khlevnoy Y.A.
*written: 20/09/2014
*last modified: 12/10/2014
************************************************************************/


#include <stdio.h>
#include <stdlib.h>
#include "mystring.h"

int main()
{
    /* some code */
    return 0;
}

/************************************************************************
*file: mystring.h
*synopsis: declarations for string UDF-functions, types, constants
*author: Khlevnoy Y.A.
*written: 20/09/2014
*last modified: 12/10/2014
************************************************************************/


#ifndef MYSTRING_H
#define MYSTRING_H
    #include <stdlib.h>

    /// Function finds the position of occurrence of the substring in the string.
    int substr (const char *pStr, const char *pSub);

    /// Function finds the length of the longest common subsequence of two strings.
    int subseq (const char *pStr, const char *pSub);

    /// Function verifies whether input string a palindrome or not.
    int ispal  (const char *pStr);

    /// Function makes as small as possible palindrome out of an input string.
    char* makepal(const char *pStr);

    /// Function parses input string into allocated array of type double.
    double* txt2double(const char *pStr, int *size);

#endif /* MYSTRING_H */

/***********************************************************************
*file: mystring.c
*synopsis: The string UDF-functions use calloc
* to allocate arrays\vectors.
* These functions are declared in the include file "mystring.h".
*related files: none
*author: Khlevnoy Y.A.
*written: 20/09/2014
*last modified: 12/10/2014
************************************************************************/


#include "mystring.h"


int substr(const char *pStr, const char *pSub)
{
    int i = 0, j = 0;                           // indexes
    int sizeStr = 0, sizeSub = 0;               // strings' size
    int match = 0;                              // variable to be returned

/* ... and a hundred lines of code */

答案 1 :(得分:0)

假设您需要在名为foo()的文件中使用文件foo.c中定义的函数main.c。有两种方法。

一种是按照评论建议将它们一起编译。

gcc -o main main.c foo.c

另一种方法是编译然后链接,这通常对于您可能想要单独的大量源文件更具可伸缩性。在这种情况下,您应该拥有以下文件。

foo.c的

#include <stdio.h>

void foo() {
    printf("Foo is called\n");    
}

foo.h中

void foo();

的main.c

#include "foo.h"

int main(){
    foo();
}

以下是编译方式:

gcc -c main.c 
gcc -c foo.c 
gcc -o main foo.o main.o