C 中自定义 getln 函数缺少原型错误消息的解释
Explanation of missing prototype error message for custom getln function in C
#include <stdio.h>
#include <stdlib.h>
#include <reg51.h>
void main (void) {
SCON = 0x52; // serial port configuration
TMOD = 0x20;
TCON = 0x40;
TH1 = 0xf3; // 2403 baudrate @12mhz
printf("Hello World");
printf("Please enter some text: ");
scanf(getLine());
}
const char *getLine()
{
char *line = NULL, *tmp = NULL;
size_t size = 0, index = 0;
int ch = EOF;
while (ch) {
ch = getc(stdin);
if (ch == EOF || ch == '\n')
ch = 0;
if (size <= index) {
size += CHUNK;
tmp = realloc(line, size);
if (!tmp) {
free(line);
line = NULL;
break;
}
line = tmp;
}
line[index++] = ch;
}
return line;
}
free(str);
这是我的代码。我认为我错误地调用了 getln。有没有办法让函数接受我可以从用户传入的输入?
此编译器是评估版,但我相信它包含我需要的库。
我的目标是接受一个 "string",或者更确切地说是一个字符数组,然后操纵它的顺序作为技能测试。我只有 2000 KB 的可用内存来写这个。
在指针和无法引用方面,我有点新手。非常感谢帮助甚至只是解释。
我正在使用 KEIL 编译器。
当我 select 程序 > 重建所有目标文件来检查我的错误时,我收到以下信息:
- 正在组装 STARTUP.A51...正在组装 XBANKING.A51...正在编译
Main.c...MAIN.C(14):警告 C206:'getln':丢失
函数原型 MAIN.C(14): error C214: 非法指针转换
未创建目标
谢谢,
您需要添加:
const char *getLine(void);
在顶部,在包含项下方。
这称为函数原型,它需要在使用函数之前出现在源文件中。
你基本上是提前告诉编译器 getLine
是一个不带参数的函数,returns const char *
。因此,即使编译器还没有看到函数的 definition,当它出现在 main
函数中时,它仍然可以验证它是否被正确使用。
否则编译器在遇到第 14 行时不知道 getLine
是什么,并给出错误。
您已经在底部正确定义了函数,但是 C 编译器需要在顶部有一个名为 prototypes
的函数列表。原型必须包括函数类型、函数名称和函数采用的任何参数。例如:
#include <stdio.h>
void hello_world(); //This is the function prototype
int main()
{
hello_world();
}
void hello_world() //You did this part correctly, but C needs the
{ //prototype at the top in order to see this as a
printf("Hello, world!\n"); //defined function
}
在你的例子中,原型只是:
const char *getLine(void);
然后您的程序将 运行 没有任何 prototype
错误。
干杯!
或者,如果你想避免定义函数原型,在main
之前定义getLine
,比如
#include ...
const char * getLine() {
...
}
int main() {
...
}
#include <stdio.h>
#include <stdlib.h>
#include <reg51.h>
void main (void) {
SCON = 0x52; // serial port configuration
TMOD = 0x20;
TCON = 0x40;
TH1 = 0xf3; // 2403 baudrate @12mhz
printf("Hello World");
printf("Please enter some text: ");
scanf(getLine());
}
const char *getLine()
{
char *line = NULL, *tmp = NULL;
size_t size = 0, index = 0;
int ch = EOF;
while (ch) {
ch = getc(stdin);
if (ch == EOF || ch == '\n')
ch = 0;
if (size <= index) {
size += CHUNK;
tmp = realloc(line, size);
if (!tmp) {
free(line);
line = NULL;
break;
}
line = tmp;
}
line[index++] = ch;
}
return line;
}
free(str);
这是我的代码。我认为我错误地调用了 getln。有没有办法让函数接受我可以从用户传入的输入?
此编译器是评估版,但我相信它包含我需要的库。
我的目标是接受一个 "string",或者更确切地说是一个字符数组,然后操纵它的顺序作为技能测试。我只有 2000 KB 的可用内存来写这个。
在指针和无法引用方面,我有点新手。非常感谢帮助甚至只是解释。
我正在使用 KEIL 编译器。
当我 select 程序 > 重建所有目标文件来检查我的错误时,我收到以下信息:
- 正在组装 STARTUP.A51...正在组装 XBANKING.A51...正在编译 Main.c...MAIN.C(14):警告 C206:'getln':丢失 函数原型 MAIN.C(14): error C214: 非法指针转换 未创建目标
谢谢,
您需要添加:
const char *getLine(void);
在顶部,在包含项下方。
这称为函数原型,它需要在使用函数之前出现在源文件中。
你基本上是提前告诉编译器 getLine
是一个不带参数的函数,returns const char *
。因此,即使编译器还没有看到函数的 definition,当它出现在 main
函数中时,它仍然可以验证它是否被正确使用。
否则编译器在遇到第 14 行时不知道 getLine
是什么,并给出错误。
您已经在底部正确定义了函数,但是 C 编译器需要在顶部有一个名为 prototypes
的函数列表。原型必须包括函数类型、函数名称和函数采用的任何参数。例如:
#include <stdio.h>
void hello_world(); //This is the function prototype
int main()
{
hello_world();
}
void hello_world() //You did this part correctly, but C needs the
{ //prototype at the top in order to see this as a
printf("Hello, world!\n"); //defined function
}
在你的例子中,原型只是:
const char *getLine(void);
然后您的程序将 运行 没有任何 prototype
错误。
干杯!
或者,如果你想避免定义函数原型,在main
之前定义getLine
,比如
#include ...
const char * getLine() {
...
}
int main() {
...
}