为什么我在另一个文件中的 void 函数在这个 C 程序中不是 运行?

Why my void function from another file is not running in this C program?

我想打印一个 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

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

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

您似乎在使用 non-standard 编译器,或者您没有正确配置它。众所周知,gcc 和 clang 等编译器会调用 non-compliant 行为,除非您使用 -std=c17 -pedantic-errors 进行编译(参见 What compiler options are recommended for beginners learning C?)。我无法使用 C 兼容编译器重现该问题。

兼容的编译器 不允许 将 non-standard 标识符放置在标准 headers 中,但 C 标准明确保留的标识符除外。保留标识符的示例包括两个前导下划线、前导下划线后跟 upper-case 字母和为将来 language/library 扩展保留的标识符。资料来源:ISO 9899:2018 第 4/6、7.1.3、6.11 和 7.31 章。

上述编译器在如上所述以 C 语言兼容模式编译时应删除所有 non-standard 标识符声明。如果没有,则您发现了编译器库错误。

存在一个旧的 well-known(而且命名非常糟糕)函数 read,但它从未成为标准 C 库的一部分。 (POSIX 试图对其进行标准化,但这与这里无关。)因此,简单的解决方案是简单地不命名标识符 read - 与其说是因为 well-known non-standard 函数具有那个名字,但因为它是一个非常糟糕的 non-descriptive 标识符名称。在您的情况下,您可以使用 read_file 或类似的。