gpt4 book ai didi

c - 为什么函数的定义和声明可以有不同的签名?

转载 作者:行者123 更新时间:2023-12-05 00:09:53 25 4
gpt4 key购买 nike

考虑以下程序(受 Tcl 源代码 here 启发):

测试.h

void func(char* format, ...);

test.c
#include <stdio.h>

#define func funcDummy
#include "test.h"
#undef func

void func(char *format, char *arg)
{
printf(format, arg);
}

main.c
#include "test.h"

int main(int argc, char *argv[])
{
(void) argc;
(void) argv;
func("I'm %s\n", "confused");
return 0;
}

使用 gcc main.c test.c -Wall -Wextra 编译时没有警告并输出“我很困惑”。

我希望看到一个关于函数 func 的引用 Unresolved 错误。这是怎么回事?

最佳答案

这是有效的,因为 C 没有错位的名称。在 C 中,符号名称是 'func'。在 C++ 中,符号名称类似于“_Zblahblah_func_blahblah_E”。 C++ 将参数编码为符号名称(稍后由链接器使用)。 C 没有。

test.c 定义了函数 void func(char *format, char *arg)。

编译 main.c 时,编译器看到:'void func(char* format, ...);'

然而,链接器将两者都简称为“func”。当链接器在 main.c 中看到调用时,它会将 func 的定义视为简单的“func”(该死的 args)。

碰巧的是,您在 main.c 中传递给它的 args 恰好与 func.c 中的预期兼容,因此它神奇地起作用。

如果您将文件更改为“cpp”而不是“c”,则会出现链接器错误(因为两个原型(prototype)的名称不匹配,并且会出现链接器错误)

TL;DR:C++ 支持函数重载,C 不支持。

关于c - 为什么函数的定义和声明可以有不同的签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59572933/

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