gpt4 book ai didi

c - 警告 : implicit declaration of function — why does my code work anyway?

转载 作者:太空狗 更新时间:2023-10-29 15:58:19 26 4
gpt4 key购买 nike

我经历了以下线程:

可能与我的问题有关。但是虽然他们提供了在使用函数之前声明函数原型(prototype)的解决方案,但我想探索当函数名称不匹配时会发生什么。在我的测试中,它仍然可以正常工作。

主 C 文件

#include "node.h"
int main(){
nd *head=NULL;
nd *tail=NULL;

create_node(&head, &tail, 10);
create_node(&head, &tail, 20);
create_node(&head, &tail, 15);
create_node(&head, &tail, 35);
create_node(&head, &tail, 5);
create_node(&head, &tail, 25);
print_list(head, tail);
create_node(&head, &tail, 55);
create_node(&head, &tail, 52);
create_node(&head, &tail, 125);

printf("%d\n",tail->data);
printf("%d\n",head->data);
print_list(head, tail);
return 0;
}

node.h 文件

#ifndef NODE_H
#define NODE_H

#include<stdio.h>
#include<stdlib.h>

typedef struct node{
int data;
struct node *next;
struct node *prev;
}nd;

void insert_node(nd **head, nd **tail, int data);

void print_list(nd *head, nd *tail);

#endif

node.c 文件

#include "node.h"
void create_node(nd **head, nd **tail, int d){

nd *temp=(nd *) malloc(sizeof(nd));
temp->data=d;
temp->next=NULL;
temp->prev=NULL;
/* Start of the Queue. */
if(*head==NULL && *tail==NULL){
*head=temp;
*tail=temp;
}
/* Linking with tail of the Queue. */
else if((*tail)->next==NULL){
(*tail)->next=temp;
temp->prev=*tail;
*head=temp;
}
/* Adding remaining elements of the Queue. */
else{
(*head)->next=temp;
temp->prev=*head;
*head=temp;
}
}

void print_list(nd *head, nd *tail){
if(NULL==head){
printf("Queue is empty\n");
}
else{
printf("Printing the list\n");
nd *temp;
for(temp=tail;temp!=NULL;temp=temp->next){
printf("%d ",temp->data);
}
printf("\n");
}
}

输出

Printing the list
10 20 15 35 5 25
10
125
Printing the list
10 20 15 35 5 25 55 52 125

node.h 中声明的函数名称是 insert_node 而在 node.c 中它是 create_node。有人可以分享一些关于它为什么运行的见解吗?不过它会发出警告:

Warning: implicit declaration of function

最佳答案

首先,您声明了一个名为insert_node 的函数,但这并不重要。可以声明函数,但不定义它们(即不提供它们的代码),只要您不使用该函数即可。这在现实生活中经常发生: header 定义了很多函数,然后在链接时只需要提供实际使用的函数。

警告涉及 create_node。由于编译主 C 文件时没有函数声明,因此编译器对其参数类型做了一些假设。它提升所有参数:小于 int 的整数类型(例如 charshort)被提升为 intfloat 被提升为 double;不转换指针类型。使用您的代码,这恰好有效,因为

  • 您总是传递正确类型的参数;
  • 没有提升任何参数类型。

如果您将 data 参数的类型更改为 long,那么编译器将生成代码来调用假设为 int 类型的函数但该函数需要一个 long 参数。在 intlong 大小不同的平台上,您可能会收到垃圾数据、崩溃或其他不当行为。

如果您将data 参数的类型更改为char,那么编译器将生成代码来调用假设为int 类型的函数但该函数需要一个 char 参数。同样,您可能会发现代码使用了错误的数据、崩溃等。

C 通常会给你足够的绳子来吊死你自己。如果你以错误的方式剪断一根绳子,它可能恰好会起作用。或者它可能不会。

关于c - 警告 : implicit declaration of function — why does my code work anyway?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21169545/

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