gpt4 book ai didi

c++ - C++ 中的名称重整

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:03 27 4
gpt4 key购买 nike

我正在浏览这篇文章 - http://www.geeksforgeeks.org/extern-c-in-c/

给出了两个例子-

int printf(const char *format,...);

int main()
{
printf("GeeksforGeeks");
return 0;
}

它说这不会编译,因为编译器将无法找到“printf”函数的损坏版本。但是,下面给出了输出。

extern "C"
{
int printf(const char *format,...);
}

int main()
{
printf("GeeksforGeeks");
return 0;
}

这是因为 extern "C" block 防止名称被破坏。但是,代码运行并给出输出。它从哪里得到'printf'的定义。我读了一篇文章,上面写着默认包含“stdio.h”。如果这是真的,下面的代码必须运行。但是,它给出了未定义 printf 的错误。

int main()
{
printf("GeeksforGeeks");
return 0;
}

谁能解释一下?

最佳答案

您的编译器通过将 printf 特殊地作为内置函数来提供帮助。

示例代码“tst.cpp”:

int printf(char const *format,...);
int foo(int a, char const *b);

int main() {
printf("Hello, World!");
foo(42, static_cast<char const *>("Hello, World!"));
return 0;
}

当使用 Microsoft 的 cl 编译器命令“cl/c tst.cpp”进行编译时,我们可以检查生成的 .obj 并发现:

00000000 r $SG2552
00000010 r $SG2554
00000000 N .debug$S
00000000 i .drectve
00000000 r .rdata
00000000 t .text$mn
U ?foo@@YAHHPBD@Z
U ?printf@@YAHPBDZZ
00e1520d a @comp.id
80000191 a @feat.00
00000000 T _main

请注意,foo() 和 printf() 都被损坏了。

但是当我们通过 cygwin "g++ -c tst.cpp"使用/usr/lib/gcc/i686-pc-cygwin/3.4.4/cc1plus.exe 编译时,我们得到:

00000000 b .bss
00000000 d .data
00000000 r .rdata
00000000 t .text
U __Z3fooiPKc
U ___main
U __alloca
00000000 T _main
U _printf

这里 foo() 被破坏而 printf() 没有,因为 cygwin 编译器很有帮助。大多数人会认为这是编译器缺陷。如果使用“g++ -fno-builtin -c tst.cpp”调用 c​​ygwin 编译器,那么问题就会消失,并且两个符号都会按应有的方式被破坏。

更新的 g++ 可以正确使用/usr/libexec/gcc/i686-redhat-linux/4.8.3/cc1plus 通过“g++ -c tst.cpp”编译我们得到:

00000000 T main
U _Z3fooiPKc
U _Z6printfPKcz

foo() 和 printf() 都被破坏了。

但是如果我们声明 printf 使得 cygwin g++ 无法识别它:

char const * printf(char const *format,...);
int foo(int a, char const *b);

int main() {
printf("Hello, World!");
foo(42, static_cast<char const *>("Hello, World!"));
return 0;
}

然后 foo() 和 printf() 都被破坏了:

00000000 b .bss
00000000 d .data
00000000 r .rdata
00000000 t .text
U __Z3fooiPKc
U __Z6printfPKcz
U ___main
U __alloca
00000000 T _main

关于c++ - C++ 中的名称重整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32285139/

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