gpt4 book ai didi

c - 没有来自拆分源的输出,但在省略包含文件时也没有警告

转载 作者:行者123 更新时间:2023-12-05 03:19:46 25 4
gpt4 key购买 nike

我在调用 gcc 时遇到了一个问题,如果我省略了一个库 .c 文件,我就没有从二进制文件中得到任何输出(意外的行为变化),但由于这是一个缺失的依赖项,我有点预期编译失败(或至少警告)...

此问题的示例来自 Head First C 第 185 页(但不是勘误表,请参阅下面我的编译错误步骤):

加密.h:

void encrypt(char *message);

加密.c:

#include "encrypt.h"

void encrypt(char *message)
{
// char c; errata
while (*message) {
*message = *message ^ 31;
message++;
}
}

message_hider.c:

#include <stdio.h>
#include "encrypt.h"

int main() {
char msg[80];
while (fgets(msg, 80, stdin)) {
encrypt(msg);
printf("%s", msg);
}
}

现在,如果我忠实地按照练习说明进行编译,一切正常:

gcc message_hider.c encrypt.c -o message_hider

...但不幸的是我只编译了主要的 .c 文件,如下所示:

$ gcc message_hider.c -o message_hider
  1. 这令人惊讶地成功构建,即使我添加了 -Wall -Wextra -Wshadow -g
  2. 同样令人惊讶的是,它悄无声息地失败了,encrypt() 函数没有任何输出:
$ ./message_hider < ./encrypt.h 
$

我的 gcc 是:

$ /usr/bin/gcc --version
Apple clang version 13.1.6 (clang-1316.0.21.2.5)
Target: x86_64-apple-darwin21.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

请注意,即使使用 Makefile,由于配方中的错误,我“仍然”可能会以丢失的 .c 文件告终。

问:如果我忘记告诉 gcc 关于 .c 文件,是否可以强制出现硬错误?

最佳答案

正如我在(拼写错误的)评论中指出的那样:

There is probably a function encrypt() in the system library.

在 Mac 上,man -s 3 encrypt显示:

CRYPT(3) BSD Library Functions Manual CRYPT(3)

NAME
crypt, encrypt, setkey -- DES encryption

SYNOPSIS

#include <unistd.h>

char *
crypt(const char *key, const char *salt);

void
encrypt(char *block, int edflag);

#include <stdlib.h>

void
setkey(const char *key);

encrypt() setkey() 函数是 POSIX 的一部分,因此它们将在大多数类 POSIX 系统上可用。奇怪的是,如手册页摘录所示,函数在单独的 header 中声明 — <unistd.h> 对于 encrypt() <stdlib.h> 对于 setkey() .断开连接可能有充分(足够)的历史原因。

您应该收到有关函数未声明的编译器警告 — 如果没有,您可能正在使用 C90 标准进行编译。那是非常古老的,不应该再被教导;您需要学习 C11 或 C18(几乎相同)。

从 C99 开始,C 标准要求函数在使用前声明——你可以定义一个 static函数无需预先声明,但所有其他函数(main() 除外)都应在使用或定义之前声明。您可以使用 GCC compiler warning options例如 -Wmissing-prototypes -Wstrict-prototypes (与 -Wold-style-declaration-Wold-style-definition 一起)触发警告。其中,-Wold-style-declaration-Wextra 启用(-Wall 没有)。请注意:如评论中所述,clang不支持 -Wold-style-declaration尽管真正的 GCC(不是苹果的 clang 伪装成 gcc )确实支持它。

关于c - 没有来自拆分源的输出,但在省略包含文件时也没有警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73346159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com