4

我想打印一个 txt 文件的内容(第一个参数),但这样做的功能是在不同的文件中。我有以下主文件:

#include <stdio.h>
#include <stdlib.h> 
#include <string.h>
#include "fileoperation.h"

int main(int argc, char **argv)
{
  read(argv[1]);  
    
  return 0;
}

然后在 fileoperation.c 文件中我有:

#include "fileoperation.h"

void read(char* file)
{
  FILE *fptr;
  char c;
  fptr = fopen(file, "r");
  if (fptr == NULL)
  {
    printf("Cannot open file \n");
    exit(0);
  }

  c = fgetc(fptr);
  while (c != EOF)
  {
    printf ("%c", c);
    c = fgetc(fptr);
  }
  
  fclose(fptr);

}

如果我从主函数中的函数键入代码,它就可以工作。我不明白为什么不工作

fileoperation.c 的头文件是

#ifndef FILEOPERATION_H
#define FILEOPERATION_H
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h> 
#include <string.h>

void read(char* file);

#endif

4

2 回答 2

7

重命名您的函数。read存在于后备库中。更糟糕的是,编译器知道它做了什么并优化了它。

可能会更糟。您可以read用自己的替换实际并炸毁标准库。

于 2021-10-27T02:37:23.860 回答
0

您似乎正在使用非标准编译器,或者您的配置不正确。众所周知,像 gcc 和 clang 这样的编译器会调用不兼容的行为,除非您使用-std=c17 -pedantic-errors(请参阅哪些编译器选项推荐给初学者学习 C?)。我无法使用符合 C 的编译器重现该问题。

兼容的编译器不允许将非标准标识符放置在标准头文件中,而不是 C 标准明确保留的那些。保留标识符的示例是具有两个前导下划线的标识符,具有前导下划线后跟一个大写字母的标识符以及为将来的语言/库扩展保留的标识符。资料来源:ISO 9899:2018 第 4/6、7.1.3、6.11 和 7.31 章。

如上所述,在 C 语言兼容模式下编译时,上述编译器应删除所有非标准标识符声明。如果没有,您发现了一个编译器库错误。

存在一个古老的、众所周知的(而且名称非常糟糕)的函数read,但它从未成为标准 C 库的一部分。(POSIX 试图对其进行标准化,但这在这里无关紧要。)因此,简单的解决方案是简单地不命名标识符read- 与其说是众所周知的非标准函数具有该名称,不如说是因为它是一个非常糟糕且非描述性标识符名称。在您的情况下,您可以使用read_file或类似的。

于 2021-10-27T07:04:09.457 回答