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
.
Related videos on Youtube
Author by
Niklas Rosencrantz
I'm as simple as possible but not any simpler.
Updated on June 04, 2022Comments
-
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 about 11 yearsIt works on ubuntu. I hope it also works on solaris and bsd. Thanks.
-
Daniel Fischer about 11 yearsShould be the same there, in any case,
man read
tells you which header(s) to include.