为什么我在另一个文件中的 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
或类似的。
我想打印一个 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
或类似的。