2013-03-08 3 views
0

Я хотел бы, чтобы моя программа компилировалась с clang без предупреждений. Функция, похоже, работает при компиляции, но почему? Как я могу обработать предупреждение?Как справиться с предупреждением от компилятора clang?

$ 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); 
    ^

Код

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

Я использую Ubuntu (и хотел бы код, чтобы работать также на Солярис и BSD).

Тест

$ ./benchm 
Unbuffered: 0.670000 seconds 
Buffered: 0.040000 seconds 
Better buffered: 0.020000 seconds 

ответ

11

Для read и write, вы должны

#include <unistd.h> 

они не объявлены в stdio.h.

+0

Это работает на ubuntu. Я надеюсь, что он также работает на solaris и bsd. Благодарю. –

+1

Должно быть то же самое, в любом случае 'man read' сообщает вам, какой заголовок должен включать. –

Смежные вопросы