2013-10-20 118 views
20

的隐式声明我想结束与手柄相关的文件,但我发现从编译器警告:功能“关闭”

的main.c:96:2:警告:隐式声明的功能“关闭” [-Wimplicit函数声明]

这是我的代码来源:

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <ctype.h> 
#include <errno.h> 
#include <string.h> 
... 
int handle; 
... 
handle = open(path, flags, mode); 
... 
close(handle); 

为什么我得到这个警告,我怎么能解决呢?

这是整个代码源:

的main.c

#include "header.h" 

// Prototypes 
void menu(char choix); 
void creer(); 
void lire(); 
int ouvrir(char *path, int flags, mode_t mode); 

int main(int argc, char **argv) 
{ 

    char choix; 
    int c; 
    printf(PROGRAME_NAME, CYAN_BOLD,RESETCOLOR, CYAN_BOLD_BG, RESETCOLOR, CYAN_BOLD, RESETCOLOR); 
    do{ 
     //printf("\e[1;1H\e[2J"); 
     printf("\n\n%sMenu :%s\n", RED_BOLD, RESETCOLOR); 
     printf("\t(%sC%s)réer un fichier\n", RED_BOLD, RESETCOLOR); 
     printf("\t(%sL%s)ire un fichier\n", RED_BOLD, RESETCOLOR); 
     printf("\t(%sE%s)crire sur un fichier\n", RED_BOLD, RESETCOLOR); 
     printf("\t(%sS%s)upprimer un fichier\n",RED_BOLD, RESETCOLOR); 
     printf("\t(%sQ%s)uitter\n",RED_BOLD, RESETCOLOR); 
     do{ 
      printf("\n%sVotre choix :%s ",GREEN_BOLD,RESETCOLOR); 
      do { 
       c = getchar(); 
       choix = tolower(c); 
      } while (c == '\n'); 
     }while((choix != 'c') && (choix != 'l') && (choix != 'e') && (choix != 's') && (choix != 'q')); 

     menu(choix); 
    }while(choix != 'q'); 

    return 0; 
} 


void menu(char choix){ 
    switch(choix){ 
     case 'c' : 
      creer(); 
     break; 
     case 'l' : 
      lire(); 
     break; 
     case 'e' : 
     break; 
     case 's' : 
     break; 
    } 
} 

void creer(){ 
    char path[64], name[64]; 
    char fullName[128]; 
    int fildes; 
    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; 
    //~ O_RDONLY : Access Mode (Read Only) 
    //~ O_CREAT : If the file does not exist it will be created 
    //~ O_EXCL : if this flag is specified in conjunction with O_CREAT, and pathname already exists, then open() will fail. 
    int flags = O_RDONLY|O_CREAT|O_EXCL; 
    printf("\n%s-->Donner l'emplacement du fichier :%s ", CYAN_NORMAL, RESETCOLOR); 
    scanf("%s", path); 
    printf("%s-->Donner le nom du fichier :%s ", CYAN_NORMAL, RESETCOLOR); 
    scanf("%s", name); 
    snprintf(fullName, sizeof fullName, "%s/%s", path, name); 
    fildes = ouvrir(fullName, flags, mode); 
    if(fildes == -1){ 
     printf("\n\t%sImpossible de créer le fichier. Réessayez plus tard. (%s)%s",RED_UNDERLINE,strerror(errno), RESETCOLOR); 
    }else{ 
     printf("\n\t%sLe fichier %s a été créé avec succès.%s", CYAN_BOLD, fullName, RESETCOLOR); 
    } 
    close(fildes); 
} 


int ouvrir(char *path, int flags, mode_t mode) 
{ 
     return open(path, flags, mode); 
} 

header.h

#include <stdio.h> 
#include <fcntl.h> // open function 
#include <unistd.h> // close function 
#include "colors.h" 
#include "const.h" 
#include <ctype.h> 
#include <errno.h> 
#include <string.h> 
+2

你从来没有定义或声明'open'和'close'什么库。你认为他们神奇地来自哪里? –

+10

@KerrekSB:在这里扮演魔鬼的拥护者,提醒你,并不是每个人都像你一样经验丰富,知识渊博,你认为魔法来自哪里?我不需要定义或声明它。 –

+0

@LightnessRacesinOrbit:假设你使用'for'是因为你的C语言教科书告诉你......如果它告诉你使用'open'和'close',它肯定会提到如何在C语言中使用头文件组织代码! –

回答

44

已包含正确的头?您需要:

#include <fcntl.h> // for open 
#include <unistd.h> // for close 

man openman close你的终端上,找出他们需要为自己

+0

我已经包含了这个头文件,但是我仍然收到相同的警告:/,我也执行了man close命令,它显示我是一个概要:#include ' – user2874861

+1

@ user2874861这真的很奇怪。如果您包含正确的标题,则不应该出现该错误。你可能会发布你的整个代码?只需编辑你的问题并把你的代码放在那里 – sukhvir

+7

为什么在不同的头文件中打开和关闭? O.o – Kevin