如何使用头文件创建简单的 C 库

How to create a simple C library using a header file

我在网上查过,语法不完全正确。我正在尝试创建一个头文件,以便我可以在另一个 C 源文件中使用函数。该函数称为 readLine(),它驻留在 myown.c 中。我想在 myown3.c.

中使用它

这是头文件myown.h

#define LINECAP 81
#ifndef MYOWN_H
#define MYOWN_H
void readLine ( char buffer [], LINECAP);
#endif

这里是myown.c

#include "myown.h"
#include <stdio.h>
void readLine ( char buffer [], int lineCapacity)   {
char  myCharacter;
  int i = 0 ;
  do {
    myCharacter = getchar();
    buffer[i] = myCharacter;
    i++;
  } while (myCharacter != '\n'  && i < lineCapacity );
  buffer [i-1] = '[=11=]';
}

void cleanBuffer ( char buffer [])  {
  int i;
  for (i=0; i<81; i++)
    buffer[i] =0;
}

int main (int argc, char *argv[])   {
/* void readLine ( char buffer [], int lineCapactiy); */
void cleanBuffer(char buffer []);

  int i;
  char line[81];
  for (i=0; i<3; i++)  {
     //cleanBuffer(line);
     readLine(line,LINECAP);
     printf("%s", line);
     //cleanBuffer(line);
  }
}

这里是 myown3.c,我想在其中使用函数:

#include "myown.h"
#include <stdio.h>
#include <stdbool.h>
bool alphabetic ( const char c) {
  //if ((c > 65 && c < 90)  || (c > 97 && c < 122))
  if (( c > 'a' && c < 'z') || ( c > 'A' && c < 'Z'))
     return true;
  else
     return false;
}

int countWords ( const char string[])    {
   int i, wordCount =0;
   bool lookingForWord= true, alphabetic (const char c);
   for ( i = 0; string[i] != '[=12=]'; ++i) {
     if (alphabetic(string[i])) {
         wordCount++;
         lookingForWord = false;
     } else {
         lookingForWord = true;
     }
   }
  return wordCount;
}

int main (int argc, char *argv[])  {
  char text[81];
  int totalWords =0;
  int countWords ( const char string[]);
  /* void readLine (char buffer[], int lineCapacity); */
  bool endOfText = false;
  printf ("Type in your text.\n");
  printf ("Wehn you are done, press 'RETURN'.\n");
  while ( ! endOfText )    {
    readLine (text, 81);

    if ( text[0] == '[=12=]')
      endOfText = true;
    else
    totalWords == countWords (text);
  }
  printf ("\nThere are %i words in the above text.\n", totalWords);
  return 0;
}

我尝试编译时出现以下错误:

gcc -I. myown.c -o myown
In file included from myown.c:1:0:
myown.h:1:17: error: expected declaration specifiers or '...' before numeric constant
 #define LINECAP 81
                 ^
myown.h:4:33: note: in expansion of macro 'LINECAP'
 void readLine ( char buffer [], LINECAP);
                                 ^
make: *** [myown] Error 1

一切正常。我花了一些时间才弄清楚我必须分别编译和 link 这些部分。当我试图一次编译所有东西时出现以下错误:

$ gcc -I. myown3.c -o myown3
C:\Users\sansari\AppData\Local\Temp\ccYfmI6U.o:myown3.c:(.text+0xd1): undefined reference to `readLine'
collect2.exe: error: ld returned 1 exit status

但以下命令有效....

gcc myown.c -c -o myown.o
gcc myown3.c -c -o myown3.o
gcc myown3.o myown.o -o myown3

删除 "void readLine()" 的冗余原型;只需使用 "myown.h" 代替:

#ifndef MYOWN_H
#define MYOWN_H

#define LINECAP 81

void readLine ( char buffer [], int linecap);

#endif

主要问题:

  • 不要将常量 (LINECAP) 放入原型中。

  • 在"myown.h"中,把你的include guard的"define* INSIDE:

  • 您根本不需要多个原型:只需在 "myown.h".

    内部定义原型 ONCE
  • 每个可执行文件必须有一个 - 只有一个 - "main()"。

  • #define LINECAP 81ONCE(在 myheader.h 中),并在其他地方使用 LINECAP(而不是“81”)。

paulsm 几乎做对了:

#ifndef MYOWN_H
#define MYOWN_H

#define LINECAP 81

void readLine(char buffer[], int lineCapacity);

#endif

参数的 类型 必须在 readLine() 的原型中声明,而不是某些解析为 81 的常量。81 不是有效的 type,也不是 LINECAP.

由于 myown.c 有一个 main()myown3.cmain() 冲突,你应该考虑将 readLine() 的定义放在一个新的文件(例如,mylib.c)和 link,第一个程序为 myown.c,第二个程序为 myown3.c。我也会将 header 重命名为 mylib.h

那么你有:

mylib.h:

#ifndef MYLIB_H
#define MYLIB_H

#define LINECAP 81

void readLine(char buffer[], int lineCapacity);

#endif

mylib.c:

#include "myown.h"
#include <stdio.h>
void readLine ( char buffer [], int lineCapacity)
{
  char myCharacter;
  int i = 0 ;
  do 
  {
    myCharacter = getchar();
    buffer[i] = myCharacter;
    i++;
  } while (myCharacter != '\n'  && i < lineCapacity );
  buffer [i-1] = '[=12=]';
}

并且 readLine()myown.c

中删除

所以现在文件是:

  • mylib.cmylib.h(没有 main()
  • 编程 myown.c,包括 mylib.h 和 link 到 mylib.c
  • 编程 myown3.c,包括 mylib.h 和 linking 到 mylib.c

并且在您的代码中,您最终可以使用常量:

readLine(text, LINECAP);

而不是

readLine(text, 81);

无论你在哪里使用81作为线路容量(例如在cleanBuffer()中),你都应该使用LINECAP,所以如果有一天你想改变容量,你只有要将值 81 更改为其他值, 仅在一处 (mylib.h).

我建议你也把一些其他的 re-usable 功能放在 mylib.c 中。