C - 防止在块作用域中使用相同的变量名

2023-12-14

我继承了一些代码,我将对其进行重构,这些代码在不同范围内广泛使用具有相同名称的多个变量,即:

int test = 456;
int main(void) {
    int test = 0;
    //...

    for (i=0; i<MAX_VAL; i++) {
        int test = 123;
        //...
    }
    return 0;
}

我知道如果相同的变量名仅在两个相关级别的范围内使用,我可以通过声明来访问全局可访问的extern int test在更深/更低层次的范围内。虽然有两个以上的级别,但我不确定哪个test正在访问变量:全局范围变量或更高一级范围的变量。

我决定重新编写代码以使用不同的变量名称,并在此过程中发现了许多过去难以跟踪的错误。当使用这种行为时,有没有办法触发警告?我必须在 Linux 中通过 GCC 编译代码,在 Windows 中通过 Visual Studio 2010 编译代码。如果不可能采用可移植的方法,那么每个编译器是否有办法对不同范围内具有相同名称的多个变量发出警告?这将使我能够构建代码并获得使用此类行为的所有位置的列表。

谢谢。


gcc 和 clang 都支持-Wshadow警告变量相互影响的标志:

-Wshadow

每当局部变量或类型声明隐藏另一个变量、参数、类型、类成员(在 C++ 中)或实例变量(在 Objective-C 中)或每当内置函数被隐藏时发出警告。请注意,在 C++ 中,如果局部变量隐藏显式变量,编译器会发出警告typedef,但如果它遮蔽了 astruct/class/enum.

来自 Visual Studio 2015默认情况下您会收到警告:

阴影变量

如果封闭范围已包含同名变量,则变量声明“隐藏”另一个变量声明。例如:

void f(int x)
{
  int y;
  {
    char x; //C4457
    char y; //C4456
  }
}

x 的内部声明隐藏了函数 f 的参数,因此编译器将发出:

警告 C4457:“x”的声明隐藏了函数参数

y 的内部声明隐藏了函数作用域中 y 的声明,因此编译器将发出:

警告 C4456:“y”的声明隐藏了先前的本地声明

请注意,与之前一样,与函数参数同名但未包含在内部作用域中的变量声明会触发错误:

 void f(int x)
 {
   char x; //C2082
 }

编译器发出:

错误 C2082:重新定义形式参数“x”

对于旧版本的 Visual Studio,您可以启用代码分析 (see 如何在 MSVC++ 中启用 6000 系列警告(代码分析警告)?)并查看警告C6244 and C6246.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C - 防止在块作用域中使用相同的变量名 的相关文章

随机推荐

  • Google Maps IOS SDK 1.2 需要地图视图快照

    在 1 1 中 GMSScreenshot 类提供了一种将整个屏幕的快照获取到 UIImage 中的基本方法 在 1 2 中 该类丢失了 在发行说明中 它是这样说的 在 GMSMapView 图层上调用 renderInContext 现在
  • 声明一个引用并稍后初始化?

    我有一些课程的参考MyObject 但确切的对象取决于条件 我想做这样的事情 MyObject ref if condition ref MyObject something else ref MyObject something else
  • Julia:使用许多不同但相关的算法选择来构建代码

    我正在寻找一种优雅的方式来重新安排我的代码 对于开发求解器 您可能会拥有许多具有相同设置的不同选项 例如 从高层次来看 代码看起来像这样 function solver Start by assigning a bunch of varia
  • REQUEST_DENIED 响应 Google Places API 请求 (sensor=true)

    我正在尝试使用 Google Places API 获取我所在位置周围的地点 以下是用于点击 URL 进行地点搜索的代码 NSString URL NSString stringWithFormat https maps googleapi
  • 在哪里/如何从 Google Maps API 获取多边形数据?

    我真的很想简短地回答这个问题 所以 我想知道谷歌地图是否拥有详细信息 在这种情况下我需要多边形 坐标数组 对于城市内的特定市政府 即Envigado在城市Medellin Co 有没有办法获取这种类型的数据 编辑 我不确定谷歌地图是否显示我
  • 如何解码 .dxf 文件?

    我想将 dxf 文件内的绘图转换为 g 代码 有一些工具可以做到这一点 但我想自己编写代码 因此 第一部分是解码 dxf 格式 然而 dxf 文件的内容看起来并不容易破译 我下载了一个 dxf 文件here并在文本编辑器中打开它 我也指的是
  • MongoDB $pull 语法

    我有一个 希望 小语法问题 pull在 Mongodb 中 bulk find id new mongo ObjectID req session id updateOne pull firstArray id req params id
  • C++:如何根据条件选择构造函数?

    假设我有一个具有不同构造函数的类 class A public A char string A int value void check 现在我想在堆栈上创建一个 A 对象 必须根据某些条件选择构造函数 但有一个问题 创建的对象被销毁然后我
  • Blazor WASP 应用程序(ASP.NET Core 托管)尝试从我的 appsettings.json 文件获取设置值

    我在尝试从 appsettings json 文件获取设置时遇到问题 我设置了一个名为 FileStorage 的本地路径 这是我的文件 我的 appsettings json 文件 Logging LogLevel Default Inf
  • Firebase 离线功能和 addListenerForSingleValueEvent

    每当我使用addListenerForSingleValueEvent with setPersistenceEnabled true 我只能设法获得本地离线副本DataSnapshot and NOT更新后的DataSnapshot从服务
  • 带有“Order Each by”子句的 Google BigQuery 大表(105M 记录)会产生“资源超出查询执行”错误

    我遇到了严重的问题 资源超过查询执行 当 Google Big Query 大表 105M 记录 带有 订购每个 条款 这是示例查询 使用公共数据集 维基百科 SELECT Id Title Count FROM publicdata sa
  • 如何通过 MySQL 查询使用 BirthDate 列获取年龄?

    我在 MySQL 数据库表中有一个 BirthDate 列来存储用户的出生日期 现在我在 html php 中有两个字段的表单 1 年龄从 2 年龄到 如果用户想要获取年龄在 10 岁到 20 岁之间的所有用户 是否可以使用 BirthDa
  • 如何在 Python 中创建 mdb 数据库文件?

    我想用 Python 在 Windows 中创建一个 mdb 数据库文件 但似乎无法用 Python 文档弄清楚它 我读到的所有内容都与建立连接以及如何使用光标有关 有什么想法吗 谢谢 我的经验comtypes模块已经相当不错了 然而 您可
  • 使用 seq() 和 rep() 迭代数字

    我需要使用rep and seq 得到以下向量 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 5 6 7 8 9 通常我只会使用for声明来实现这一点 但我被限制使用它 只能使用rep and seq 来实
  • 添加新的核心数据模型版本后出错

    我添加了一个新的模型版本 并将核心数据模型设置为使用该新版本 但当应用程序尝试启动时出现此错误 用于打开持久存储的托管对象模型版本与用于创建持久存储的版本不兼容 我猜问题是当前的持久存储是模型的旧版本 有没有办法直接删除它 然后再创建一个新
  • Three.js r125 BufferGeometry`顶点`不存在

    我正在更新 Three js 我发现当我升级到 r125 时 尝试设置vertices由于缺少方法 BufferGeometry 失败 似乎也已删除verticesNeedUpdate The 迁移指南似乎没有对此发出警告并且变更日志据我所
  • Team Foundation Server 2010 不支持我的 .tfignore 文件

    这是我的 tfignore 它位于分支的根目录中并提交给 TFS 但它永远不会受到尊重 我想我错过了一些我在阅读中不清楚的语法细节TechNet 有关 tfignore 文件的文章 但是什么 Team Foundation Server S
  • PHP:使用 php 邮件程序发送 ical

    我正在尝试使用 php 邮件程序发送 ical 这是我的功能 function sendIcalEmail firstname lastname email meeting date meeting name meeting duratio
  • 创建谷歌日历事件

    我正在尝试使用下面给出的代码创建谷歌日历事件 但我得到了类 Event not found 如何创建新事件 请帮忙
  • C - 防止在块作用域中使用相同的变量名

    我继承了一些代码 我将对其进行重构 这些代码在不同范围内广泛使用具有相同名称的多个变量 即 int test 456 int main void int test 0 for i 0 i