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

时间:2016-07-04 22:35:54

标签: c c-preprocessor header-files

我已经在线查看,无法完全正确地获取语法。我正在尝试创建一个头文件,以便我可以在另一个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] = '\0';
}

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] != '\0'; ++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] == '\0')
      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

一切顺利。我花了一些时间才弄清楚我必须分别编译和链接这些部分。当我尝试一次编译所有内容时出现以下错误:

$ 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

2 个答案:

答案 0 :(得分:2)

保尔姆几乎做对了:

#ifndef MYOWN_H
#define MYOWN_H

#define LINECAP 81

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

#endif

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

由于myown.c的{​​{1}}与main()的{​​{1}}冲突,您应该考虑将myown3.c的定义放在新文件中(比如,main())并将其链接到第一个程序的readLine()和第二个程序的mylib.c。我也会将标题重命名为myown.c

那么你有:

mylib.h:

myown3.c

mylib.c:

mylib.h

#ifndef MYLIB_H #define MYLIB_H #define LINECAP 81 void readLine(char buffer[], int lineCapacity); #endif 已删除#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] = '\0'; }

现在文件是:

  • 图书馆readLine()myown.c(并且没有mylib.c
  • 计划mylib.h,包括main()并链接到myown.c
  • 计划mylib.h,包括mylib.c并链接到myown3.c

在你的代码中,你最终可以使用常量:

mylib.h

而不是

mylib.c

无论您将readLine(text, LINECAP); 用于行容量(例如readLine(text, 81); ),都应使用81,因此如果您想要更改容量一天,则只需更改价值cleanBuffer()为其他内容,仅在一个地方LINECAP)。

我建议你在81中添加一些其他可重复使用的功能。

答案 1 :(得分:0)

删除您的冗余原型“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的“定义* INSIDE

  • 您根本不需要多个原型:只需在“myown.h”中定义原型 ONCE

  • 每个可执行文件必须有一个 - 而只有一个 - “main()”。

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