gpt4 book ai didi

c - 为什么编译器显示 "Call to function with no prototype"?

转载 作者:太空宇宙 更新时间:2023-11-04 00:36:23 25 4
gpt4 key购买 nike

我正在尝试使用 DOS 视频内存打印一个字符串,但是当我调用函数 print_Id ();(*old)(); 时它显示这些警告并且不运行代码但没有这些功能一切正常。

在没有原型(prototype)的情况下调用函数 print_id

调用没有原型(prototype)的函数

我在顶部写了这个函数,但都是徒劳的。

请查看下面我的代码;我正在使用 BORLANDC 编译器。

#include<stdio.h>
#include<BIOS.H>
#include<DOS.H>
#include<conio.h>
int j;

void interrupt (*old)();
void interrupt print_name();
void interrupt print_Id();
char st[80] ={"Bilal Maqsood$"};
char id[20]={"BC110403231$"};
char far *scr=(char far* ) 0xb8000f3C;

int main( )
{
clrscr();

old=getvect(0x08);
setvect(0x08,print_name); //corrected
return 0;
}


void interrupt print_name(){

int i=0;
int j=0;

while(st[i]!='$'){
*(scr+j)=st[i];
*(scr+j+1)=0x72;
i++;
j+=2;
}
print_Id ();
}

void interrupt print_Id ( )
{
int i=0;
int j=0;

while(id[i]!='$'){
*(scr+j)=id[i];
*(scr+j+1)=0x17;
i++;
j+=2;
}

(*old)();
}

最佳答案

对于这三个声明,您应该会收到编译器警告:

void interrupt (*old)();
void interrupt print_name();
void interrupt print_Id();

这些声明了一个函数指针和两个函数。这些都没有在 C 中定义原型(prototype)。后两个声明函数的存在并且返回类型是 void(并且 interrupt 是 Borland 特定的或 DOS-特定的干扰词)。但是空括号意味着“参数列表是未定义的,除了它不是可变参数函数——所以在实际参数列表中没有 ... 省略号”。

要使它们成为原型(prototype),您需要明确指定函数不带参数:

void interrupt (*old)(void);
void interrupt print_name(void);
void interrupt print_Id(void);

这与 C++ 不同,在 C++ 中,空括号表示“无参数”。当 C 被标准化时,差异是必要的,因为在 C89/C90 标准之前原型(prototype)还不是 C 的一部分,并且所有现有代码都必须使用空括号来表示“函数存在但你对函数一无所知arguments”,如果它破坏了所有现有的 C 代码,标准就会失败。

之所以只得到两次调用的警告,正是因为警告是在使用函数名或函数指针调用函数时产生的;当函数名称用作函数指针时不是。这三个问题都需要修复。

顺便说一句,我更喜欢让声明和定义保持一致,所以我也总是在函数定义中使用显式的 void 参数列表;如果它也是独立的,它确保函数定义提供原型(prototype)。

关于c - 为什么编译器显示 "Call to function with no prototype"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33855949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com