1

我正在尝试使用 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)();
}
4

2 回答 2

5

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

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

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

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

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

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

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

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

于 2015-11-22T15:51:27.467 回答
3

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

出于这个原因,如果您在调用print_id()之前没有声明或定义它的调用,编译器将发出警告。

(虽然我在您发布的代码中看到 no print_id,包括调用...)

于 2015-11-22T14:39:00.073 回答