如何使用头文件创建简单的 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 81
仅 ONCE(在 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.c
的 main()
冲突,你应该考虑将 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.c
有 mylib.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
中。
我在网上查过,语法不完全正确。我正在尝试创建一个头文件,以便我可以在另一个 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 81
仅 ONCE(在 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.c
的 main()
冲突,你应该考虑将 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.c
有mylib.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
中。