我已經通過以下線程不見了:警告:函數的隱式聲明 - 爲什麼我的代碼無論如何工作?
可能我的問題是聯繫在一起的。但是,儘管他們提供了在使用函數之前應該聲明函數原型的解決方案,但是我想探索當函數名稱不匹配時會發生什麼。在我的測試中,它仍然正常工作。
主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
它的工作原理是'main'調用'create_node','create_node'是'node.c'中實際聲明的內容。參數類型恰好足夠通用,它們都可以。標題中名稱中的錯誤會導致警告。如果'node.c'中的'create_node'實際上被稱爲'insert_node',則鏈接將失敗並且說它找不到定義爲'create_node'的函數。 – lurker
是你的問題「爲什麼我的編譯器不會將警告視爲錯誤?」這是一個標誌。 – geoffspear
這不是「正常工作」。如果調用未聲明的函數產生一些輸出,那麼它是錯誤的,無論如何(因爲行爲是未定義的)。雖然它可以*假裝*以「工作正常」。這並不意味着它確實可以正常工作。 – 2014-01-16 18:13:41