为什么编译器显示“没有原型调用函数”?

时间:2015-11-22 14:35:57

标签: c dos borland-c

我正在尝试使用DOS视频内存打印字符串,但是当我调用函数print_Id ();(*old)();时 它显示了这些警告并且没有运行代码,但没有这些功能,每件事情都可以正常工作。

调用功能print_id,没有原型

调用无原型功能

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

请查看下面的代码;我正在使用 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)();
}

2 个答案:

答案 0 :(得分:3)

声明void interrupt print_Id();print_id()不同,因为i的情况不同。

因此,如果在调用之前调用print_id()而没有声明或定义它,编译器将发出警告。

(虽然我在你发布的代码中看不到print_id,包括致电...)

答案 1 :(得分:3)

您应该收到三个声明的编译器警告:

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

这些声明了一个函数指针和两个函数。这些都没有在C中定义原型。后两者声明了函数的存在,并且返回类型是void(并且interrupt是Borland特定的或特定于DOS的噪声字)。但空括号表示&#34;参数列表未定义,除了它不是可变参数函数 - 因此实际参数列表中没有...省略号&#34;。

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

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

这与C ++不同,C ++中的空括号表示没有参数&#39;。当C被标准化时,差异是必要的,因为原型在C89 / C90标准之前不是C的一部分,并且所有现有代码都必须使用空括号来表示&#34;功能存在但你不是了解函数参数&#34;如果它破坏了所有现有的C代码,标准就会失败。

您只获得两次调用警告的原因正是因为当使用函数名或函数指针调用函数时会生成警告;当函数名称用作函数指针时。这三个都需要修复。

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