微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果全局变量和函数具有相同的名称,会发生什么?

如何解决如果全局变量和函数具有相同的名称,会发生什么?

众所周知,函数和变量不能使用相同的名称
像这样:

#include<stdio.h>
int main;
int main()
{
    return 0;
}

“ main”引起的这种情况被重新声明为另一种符号。
但是以下两个文件可以成功编译,这让我感到困惑。 main.c:

void print_main(void);

int main() {
    print_main();
    return 0;
}

print_main.c

#include <stdio.h>

char main;

void print_main() {
    printf("Output: 0x%x\n",main);    //Output: ffffffe9
}

困惑

  • 我想知道为什么编译器没有提醒我“ main”重新声明为另一种符号吗?
  • 为什么我得到一个奇怪的数字“ ffffffe9”,这是什么?
  • 当我在另一个IDE上运行这些文件时,为什么奇怪的数字改变了?

我尝试过的事情

  • 事实上,我知道它是由全局变量“ main”和函数“ main()”具有相同的名称引起的。
    因此,这里发生了一些有趣的事情。
  • 编译并在Visual Studio 2019上运行它,输出为“ ffffffe9”。
    但在CLion上编译并运行它,输出将为“ 0x55”
  • 当我尝试检查变量“ main”的地址时,发现与函数“ main()”的地址相同。
    像这样

main.c

void print_main(void);

int main() {
    printf("%p\n",&main);   // 003D12BC 
    print_main();            
    return 0;
}

print_main.c

#include <stdio.h>

char main;

void print_main() {
    printf("Output: %x\n",main);   //ffffffe9
    printf("%p\n",&main);          //003D12BC
}

解决方法

似乎几天前我回答了基本上相同的问题。哦,等等,I did。如果对方的OP接受了答案,我将以重复的方式结束当前的问题。

摘要:

  • 一个合格的编译器必须在一个翻译单元中诊断同一标识符的不兼容声明,但对于在不同翻译单元中的声明,则不需要诊断该问题。

  • 无论哪种情况,都不需要合格的编译器拒绝该程序,无论它是否发出诊断,但如果接受,则该程序具有未定义的行为。

  • 我想知道为什么编译器没有提醒我“ main”重新声明为另一种符号吗?

没有义务这样做(参见上文),并且单独编译使其具有挑战性。最终,这是实施质量的问题。

  • 为什么我得到一个奇怪的数字“ ffffffe9”,这是什么?

两个词:未定义的行为。

  • 当我在另一个IDE上运行这些文件时,为什么奇怪的数字改变了?

再次:未定义的行为。

尝试探究程序的未定义行为在不同的C实现中表现出来的各种方式并没有多大用处。而是编写行为定义明确的程序。尤其不要编写您知道未定义行为的程序。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。