Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implicit declaration of function ‘close'

Tags:

c

I want to close a file associated with a handle, but I'm getting a warning from the compiler:

main.c:96:2: warning: implicit declaration of function ‘close’ [-Wimplicit-function-declaration]

And this is my source code:

#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);

Why am I getting this warning and how can I solve it?

This is the complete source code:

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>
like image 817
user2874861 Avatar asked Oct 20 '13 00:10

user2874861


People also ask

What is an implicit declaration of a function?

If a name appears in a program and is not explicitly declared, it is implicitly declared. The scope of an implicit declaration is determined as if the name were declared in a DECLARE statement immediately following the PROCEDURE statement of the external procedure in which the name is used.

What is implicit declaration warning?

You are using a function for which the compiler has not seen a declaration ("prototype") yet. For example: int main() { fun(2, "21"); /* The compiler has not seen the declaration.

How do you fix an implicit function declaration?

Function name typo: Often the function name of the declaration does not exactly match the function name that is being called. For example, startBenchmark() is declared while StartBenchmark() is being called. I recommend to fix this by copy-&-pasting the function name from the declaration to wherever you call it.

What is implicit declaration error in C?

Such an 'implicit declaration' is really an oversight or error by the programmer, because the C compiler needs to know about the types of the parameters and return value to correctly allocate them on the stack.


1 Answers

Have you included right headers? You need the following:

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

do man open and man close on your terminal to find out what libraries they need for yourself

like image 154
sukhvir Avatar answered Sep 24 '22 00:09

sukhvir