gpt4 book ai didi

c - 未定义的函数引用被编译器接受

转载 作者:太空狗 更新时间:2023-10-29 17:09:48 24 4
gpt4 key购买 nike

好的,我有这段代码:

str.c:

char *str = "example";

ma​​in.c:

int str(void);

int main(void)
{
str();

return 0;
}

生成文件:

CC = gcc
CFLAGS = -Wall -g

all: main

main: main.o str.o

main.o: main.c
str.o: str.c

clean:
rm -rf *.o main

乍一看,可能会说这是一个 undefined reference 错误或类似的错误。但是编译器只是简单地接受这段代码。

问题是,为什么我没有得到编译错误?

很明显函数没有正确定义。如果我使用 gdb 中断 str() 调用,我会收到警告类型 Function str not defined.

最佳答案

首先(正如其他人已经指出的那样)如果在“构建”可执行文件 main 时可能会出现错误,那么在链接阶段,即因为 int str( void) 未在任何翻译单元(.c 文件)中定义,因此编译器未将其放入任何目标文件(.o)中。

但不幸的是,您定义了 char * str = "..."

C(与其他语言相反,例如 C++)不注释函数,它不创建函数签名,而只是函数的名称,符号名称。它对所有其他对象也是如此。

因此链接器别无选择,只能检查可用符号的名称,如果它们 1:1 匹配则链接它们。它无法进行双重检查,因为编译器没有将任何验证信息放入目标文件中。

如果您在对象内部某处有 int str(void) 的实现(一个定义,而不仅仅是一个声明)链接,然后链接器会注意到没有 1:1 匹配,所以可能会发生一些可疑的事情。

关于c - 未定义的函数引用被编译器接受,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44459886/

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