How to handle a warning from the clang compiler?

12,264

For read and write, you have to

#include <unistd.h>

they're not declared in stdio.h.

Share:
12,264

Related videos on Youtube

Niklas Rosencrantz
Author by

Niklas Rosencrantz

I'm as simple as possible but not any simpler.

Updated on June 04, 2022

Comments

  • Niklas Rosencrantz
    Niklas Rosencrantz almost 2 years

    I'd like my program to compile with clang with no warnings. The function appears to work when compiled but why? How can I handle the warning?

    $ clang cpu-disk-info.c
    cpu-disk-info.c:108:17: warning: implicit declaration of function 'read' is
          invalid in C99 [-Wimplicit-function-declaration]
        while ((n = read(0, buf, betterSIZE)) > 0)
                    ^
    cpu-disk-info.c:109:5: warning: implicit declaration of function 'write' is
          invalid in C99 [-Wimplicit-function-declaration]
        write(1, buf, n);
        ^
    

    Code

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define SIZE 1024
    #define betterSIZE 4*SIZE /* read a better size at a time */
    
    int main(int argc, char **argv)
    {
    
        /* copy(); */
    
        /* make the names known */
    
        void info(char file_name[]);
        void buffered(char file_name[]);
        void better_buffered(char file_name[]);
    
       /* test */
    
        clock_t toc;
        clock_t tic = clock();
        info("coreutils_8.13.orig.tar.gz"); 
        info("coreutils_8.13.orig.tar.gz"); 
        info("coreutils_8.13.orig.tar.gz"); 
        info("coreutils_8.13.orig.tar.gz"); 
        info("coreutils_8.13.orig.tar.gz"); 
        toc = clock();
        printf("Unbuffered: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);
        tic = clock();    
        buffered("coreutils_8.13.orig.tar.gz"); 
        buffered("coreutils_8.13.orig.tar.gz"); 
        buffered("coreutils_8.13.orig.tar.gz"); 
        buffered("coreutils_8.13.orig.tar.gz");
        buffered("coreutils_8.13.orig.tar.gz"); 
        toc = clock();
        printf("Buffered: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);
        tic = clock();    
        better_buffered("coreutils_8.13.orig.tar.gz"); 
        better_buffered("coreutils_8.13.orig.tar.gz"); 
        better_buffered("coreutils_8.13.orig.tar.gz"); 
        better_buffered("coreutils_8.13.orig.tar.gz");
        better_buffered("coreutils_8.13.orig.tar.gz"); 
        toc = clock();
        printf("Better buffered: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);
        return 0;
    }
    
    void info(char file_name[])
    {
        int ch;
        FILE *fp;
        fp = fopen(file_name,"r");
        // read mode
        if (fp == NULL)
        {
            perror(file_name);
            exit(EXIT_FAILURE);
        }
        while ((ch = fgetc(fp)) != EOF)
        {
            //putchar(ch);
        }
        fclose(fp);
    }
    
    void buffered(char file_name[])
    {
        char buf[SIZE];
        FILE *fp;
        size_t nread;
        fp = fopen(file_name, "r");
        if (fp) {
            while ((nread = fread(buf, 1, sizeof buf, fp)) > 0)
        {
                //fwrite(buf, 1, nread, stdout);
        }
            if (ferror(fp)) {
                /* to do: deal with error */
            }
            fclose(fp);
        }
    }
    
    
    void better_buffered(char file_name[])
    {
        char buf[betterSIZE];
        FILE *fp;
        size_t nread;
        fp = fopen(file_name, "r");
        if (fp) {
            while ((nread = fread(buf, 1, sizeof buf, fp)) > 0)
        {
                //fwrite(buf, 1, nread, stdout);
        }
            if (ferror(fp)) {
                /* to do: deal with error */
            }
            fclose(fp);
        }
    }
    
    int copy() /* input2output ie anything to anything */
    {
        char buf[betterSIZE];
        int n;
        while ((n = read(0, buf, betterSIZE)) > 0)
        write(1, buf, n);
        return 0;
    }
    

    I'm using ubuntu (and would like the code to work also on solaris and bsd).

    Test

    $ ./benchm 
    Unbuffered: 0.670000 seconds
    Buffered: 0.040000 seconds
    Better buffered: 0.020000 seconds
    
  • Niklas Rosencrantz
    Niklas Rosencrantz about 11 years
    It works on ubuntu. I hope it also works on solaris and bsd. Thanks.
  • Daniel Fischer
    Daniel Fischer about 11 years
    Should be the same there, in any case, man read tells you which header(s) to include.