我已经在线查看,无法完全正确地获取语法。我正在尝试创建一个头文件,以便我可以在另一个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
答案 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”)。