• C/C++陷阱——变量名和函数名的冲突问题


    C语言/C++陷阱——变量名和函数名的冲突问题

    先来看这两串代码:

    代码一:

    #include 
    #include 
    
    int rand = 1;
    
    int main()
    {
    	printf("%d\n", rand);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    代码二:

    #include 
    #include 
    
    int main()
    {
    	int rand = 1;
        
    	printf("%d\n", rand);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    可以看到,这两串代码的唯一区别就是:代码一·的变量rand是一个全局变量,而代码二的变量randmain函数中的局部变量。

    同时我们也清楚,randstdlib.h头文件中,用于实现随机数的函数的函数名

    那么大家认为,那一串代码有错误呢?

    答案是代码一有错误,而代码二可以通过编译,以下是报错信息:

    在这里插入图片描述

    意思大致为:全局变量rand函数名rand发生了命名冲突

    那么有小伙伴就不懂了:为什么将rand变为局部变量,就不会和函数rand发生冲突了呢?

    这就是我们要讨论的内容——变量名(全局变量/局部变量)和函数名的冲突问题

    1.1 全局变量和函数名

    全局变量是定义在函数外的变量,其作用范围是整个文件,而函数的作用范围也是整个文件

    因此,如果全局变量的名字和某个函数名相同的话,就会发生命名冲突,从而导致编译不通过。

    解决的办法有两种:

    第一种:修改全局变量的名称,例如:

    #include 
    #include 
    
    int my_rand = 1;
    
    int main()
    {
    	printf("%d\n", rand);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    第二种:用一个命名空间包裹全局变量(仅C++可用)。例如:

    #include 
    #include 
    
    namespace test
    {
    	int rand = 1;
    }
    
    int main()
    {
    	printf("%d\n", test :: rand);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    1.2 局部变量和函数名

    局部变量是定义在函数内的变量,它的作用域仅限于定义它的函数或者代码块。

    如果局部变量的名字和某个函数名发生冲突,那么这个局部变量就会将这一个函数隐藏,但仅在该函数内部。这意味着在函数内,该局部变量会被使用,而此函数不会被访问。(局部变量和全局变量的关系同理)

    例如对于下面的代码:

    #include 
    
    void Fun()
    {
    	printf("Hello\n");
    }
    
    int main()
    {
    	int Fun = 1;
    
    	Fun();
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    就会有如下的报错信息:

    在这里插入图片描述

    意思大致为:局部变量名Fun将函数Fun隐藏了,那么在main函数内就不能再调用函数Fun了。

    需要注意:这种遮蔽是C语言的一种特性,允许在不同的作用域中使用相同名称的变量,但开发者需要小心,以避免混淆和错误的发生


    本篇完。

  • 相关阅读:
    非线性光学散射偏微分方程组的matlab求解仿真
    开学季征文|卷生卷死之新学期大学生自救指南!!!
    Mybatis-Plus复杂语句多级嵌套分组带分页查询
    Excel - 字符串处理函数:LEFT, RIGHT, MID, LEN 和 FIND
    WSL2最佳实践,淘汰难用的Xshell和Finalshell
    实战:springboot整合rabbitMQ
    C#程序变量统一管理例子 - 开源研究系列文章
    SonarQube系列-通过配置扫描分析范围,聚焦关键问题
    产品经理看过来,2023年NPDP考试日期来了!
    如何给图片降噪?看完你就学会了
  • 原文地址:https://blog.csdn.net/l315225/article/details/133822744