簡體   English   中英

使用 make 編譯時的警告

[英]warning when compiling with make

我編寫了一個程序,將標准條目復制到標准輸出和文件中。 該程序可以運行,但我遇到了問題,在使用make編譯時收到警告:

warning: implicit declaration of function ‘isprint’ [-Wimplicit-function-declaration]
    if (isprint(optopt))
        ^~~

代碼:

雖然這沒什么大不了的,但我希望它停止顯示此警告。 會有什么問題? 我也想審查代碼,我可以改進什么? 該程序的行為類似於tee -a file命令。

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

static int append_mode = 0;

int parse_args(int argc, char *argv[])
{
    char c;
    while ((c = getopt(argc, argv, "a")) != -1) {
        switch (c) {
        case 'a':
            append_mode = 1;
            break;
        case '?':
            if (isprint(optopt))
                fprintf(stderr, "Unkonw option `-%c'.\n", optopt);
            else
                fprintf(stderr,
                    "Unknown option character `\\x%x'.\n", optopt);
            return 1;
        default:
            abort();
            break;
        }
    }
    return 0;
}

int main(int argc, char *argv[])
{
    char buf[100];
    size_t len;
    char *file_mode;
    int i;
    FILE *files[20];
    int num_files;
    
    if (parse_args(argc, argv)) {
        return 1;
    }
    
    file_mode = (append_mode ? "a" : "w");
    
    num_files = argc - optind;
    if (num_files > 0) {
        if (files == NULL) {
            fprintf(stderr, "Unable to allocate file buffer space\n");
            return 1;
        }

        /* go through file arguments and either open for writing
           or append based on the -a flag */
        for (i = optind; i < argc; i++) {
            FILE *pFile = fopen(argv[i], file_mode);
            if (pFile == NULL)
            {
                fprintf(stderr, "Unable to open file %s for mode %s",
                    argv[i], file_mode);
                goto main_cleanup;
            }
            files[i - optind] = pFile; /* mind the offset */
        }
    }
    
    FILE *not_stdin = fopen("tee.c", "r");
    while ((len = fread(&buf[0], 1, sizeof(buf), not_stdin)) > 0) {
        fwrite(&buf[0], 1, len, stdout);
        for (i = 0; i < num_files; i++) {
            fwrite(&buf[0], 1, len, files[i]);
        }
    }

    main_cleanup:
    if (num_files > 0) {
        for (i = 0; i < num_files; i++) {
            fclose(files[i]);
        }
    }

    return 0;
}

大多數情況下,當您嘗試使用 function 而不包括其所需的 header 時,會出現此警告。

要使用isprint()#include <ctype.h>添加到包含的標頭中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM