C语言对话-24.好的,坏的,不赞成的
sebastian 翻译关于我第一次程序设计工作的可笑事这是很多年以后我在与我的新婚妻子珍妮喝早茶时谈起的。是鲍勃如何死皮赖脸地不想离职尽管他根本无法胜任。我记得一个很特别的天气晴朗春天的早晨....当时我正在努力地完成一段新代码。这时鲍勃逛到了我的工作隔间依在隔间的墙上喝了一口咖啡。--不我不知道他手上为什么总是有一杯咖啡鲍勃站在那里微笑的说嗨菜鸟。”我漫不经心的说“嗨鲍勃什么事”“这段代码你上周检查过了吗”他耸耸肩“好它破坏了整体结构。编译器说你定义了Output函数两次你不能这样做。”“什么”我诧异的说“但是我肯定我已经生成了……”我快速的把我一周前做的文件调入了编辑器//--- file trans.cpp -----------------------------//static void Output( ostream o ) { /*...*/ }// ...void ProcessTransaction( /*...*/ ){// ...Output( cout );// ...}“这些不是很好吗”我说道坐了回去心里很满意看来鲍勃完全是无中生有。鲍勃笑了笑。“继续看下去。”他催促道。我皱了皱眉用grep扫描了源代码。期望发现Output函数在同一模块中是否还出现在其他什么地方。另人惊讶的是我在另3个文件里发现了它。//--- file output.h ------------------------------void Output( std::ostream );//--- file output.cpp ----------------------------#include output.h// ...void Output( ostream out ) { /*...*/ }//--- file dbinit.cpp ----------------------------//#include output.h// ...void InitDatabase(){// ...Output( clog );// ...}我沉思了一下。“但是这是同一个Output函数吗”我问道。鲍勃不耐烦的用拿着咖啡杯的手比划了一下你刚才没听我说吗我刚才告诉你了你写的代码。无法正常生成。“生成什么”“就在我们的嵌入式目标平台上至少我看到生成器抱怨无法生成。修正它弄完后告诉我一起我可以接下去干。”鲍勃呷了一口咖啡叫了几声然后离开了。好了我老实承认一开始我并不相信鲍勃的话。我试着用我们一直用的编译器重新生成一切正常。我受到鼓舞更换了Shell,用我们用于嵌入式目标的编译器重成生成结果无法生成。我呆了下来喃喃自语我用的第一个编译器允许两个Output函数共存但另外一个编译器却抱怨说存在重复的定义尽管前后两个是同一段代码。我打算放弃了并去向温迪求教时我听到了我身后传来了一阵飒飒的翻书声这时一声合上书的声音从我身后传来“需要帮助吗Guru的声音从我后面传来了“你好像遇到了什么难题了需要我帮忙吗”我转过来看到她在微笑“当然”我很高兴有人来帮我“这是我写的代码这里是编译器反映的错误我到底错在哪里了”她快速的扫视了一遍代码和编译结果。“哦”她说“这里有两个问题但是我们以前已经讨论研究过了这个问题你认为发生了什么事你尽所能解释一下发生了什么。”我接受了挑战“好的对...一个是在trans.cpp中我希望在ProcessTans中调用Output是那个静态版本的Output。”“还有呢”她催促道。“另一方面在dbinit.cpp中我希望在InitDatabase中对Output的调用将会是外部定义的Output,存在于output.cpp。”“但是...”她又催促道。“值得注意的是我们的主要编译器看来同意我的做法否则的话我在代码上交前就应该发现问题。但另一个编译器却不允许这样做。”“做的很好”Guru平静的说“现在沉思一下你所看到的东西你将发现这里的确有两个很明显的问题第一个问题是嵌入式编译器出错了很明显你的的代码是合法的而我们主要使用的编译器确实对这段代码进行了正确的处理。一个函数如果是被声明为static的话仅仅是做内部连接也就是说根据概念3:5第三段的标准来的但是其他的output是进行外部连接的依据概念3:5第九段它和trans.cpp内的静态版本的Output不是同一个函数这就是说为什么嵌入式编译器出错无法正确辨认出两个Output这是两个截然不同的函数而不是一个。”“原来如此”我放心的说“酷这下子我懂了。”“你肯定吗第二个问题是”Guru继续说“尽管你代码是合法的但是它并不遵守我们的编码标准。”“什么我使用了正确的对齐和缩进啊。”Guru退了一步紧紧闭住眼睛并挥手示意我安静。“不不不不。没有哪种编码标准值得你浪费时间这样定义东西包括我们。除了当然嵌入表是有害的不管是用哪种形式的使用空格的缩进。不你可能看的是鲍勃在他以前工作时带来的标准但这些东西现在并不适用。”“还有,”她继续道“问题是你对static的使用你这种static的使用方法是老式的、陈旧的、不提倡使用的而且大多数都被认为是有缺陷的。”。她打开了她的书现在我知道那是Stroustrup的The C Programming Language [1],找出一处临近书尾的地方引述道“用static来表示‘本地于编译单位’在C中是不被提倡的...”她透过了眼镜看了看我继续引述“用无名的名字空间来代替。”我灵机一动“哦我知道该怎么做了”我改正了代码//--- file trans.cpp -----------------------------//namespace{void Output( ostream o ) { /*...*/ }}// ...void ProcessTransaction( /*...*/ ){// ...Output( cout );// ...}“当然我的徒弟我现在确实相信我们过时的嵌入式编译器可以正确的处理你修订过的代码。”声音渐渐的消失我转过身去发现Guru已经不见了就像她来的时候。我笑了笑活动了一下指关节成功的重写了代码并通过了所有的编译器编译和单元测试并呈交了代码。我微笑的打开了email给鲍勃发了一封简短而又含糊其词的通知。[参考文献][1] Bjarne Stroustrup. The C Programming Language, 3rd Edition (Addison-Wesley, 1997).

相关新闻

数据库索引决策与优化提示

数据库索引决策与优化提示

简介:本文档深入剖析数据库优化器(Optimizer)的工作原理,解释全表扫描优于索引的场景,并详细列出了强制数据库使用特定索引的语法(Index Hints)。1. 核心原理:数据库是如何做决策的&…

2026/7/3 14:51:16 阅读更多 →
计算机毕业设计之springboot校园疫情防控系统的设计与实现

计算机毕业设计之springboot校园疫情防控系统的设计与实现

当今社会已经步入了科学技术进步和经济社会快速发展的新时期,国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统校园疫情防控管理采取了人工的管理方法&#xf…

2026/7/5 4:56:26 阅读更多 →
为“万人大型国企”重塑财务筋骨:一场由合思AI审核驱动的业财融合革命

为“万人大型国企”重塑财务筋骨:一场由合思AI审核驱动的业财融合革命

当一家万名员工规模的国有企业决意精简审核流程,其面临的挑战绝非单一工具能够破解。这既是对臃肿体系的“刮骨疗毒”,更是对效率与风险平衡逻辑的重新定义。纵观市场,破局的关键不在于寻找功能最全的“瑞士军刀”,而在于锚定最能…

2026/7/5 19:11:29 阅读更多 →

最新新闻

抖店体验分怎么提升-4点8分实操方法-抖音电商2026规则落地

抖店体验分怎么提升-4点8分实操方法-抖音电商2026规则落地

抖店体验分怎么提升?提升到4.8全套实操方法|抖音电商2026规则落地 前言 2026抖音电商体验分权重重新划定:商品体验50%、服务体验35%、物流体验15%,4.8分是店铺核心分水岭。低于4.8分,千川流量、商品卡自然流权重、平台…

2026/7/6 2:01:44 阅读更多 →
Haiwell Cloud SCADA 3 与主流 PLC 协议对比:支持 3 类设备驱动的连接实测

Haiwell Cloud SCADA 3 与主流 PLC 协议对比:支持 3 类设备驱动的连接实测

Haiwell Cloud SCADA 3 与主流 PLC 协议深度兼容性实测报告在工业自动化系统集成领域,多品牌PLC设备的互联互通一直是工程师面临的现实挑战。海为科技最新发布的Cloud SCADA 3版本以"内置多种工业设备驱动"为核心卖点,宣称能够无缝对接西门子、…

2026/7/6 1:59:44 阅读更多 →
数字通信同步技术:3种载波同步方法对比与低信噪比场景实战

数字通信同步技术:3种载波同步方法对比与低信噪比场景实战

数字通信同步技术:3种载波同步方法对比与低信噪比场景实战在数字通信系统中,载波同步是实现可靠数据传输的核心技术之一。当信号经过信道传输后,接收端需要精确恢复发送端的载波频率和相位,才能正确解调出原始信息。尤其在低信噪比…

2026/7/6 1:59:44 阅读更多 →
缠论终极自动化解决方案:5分钟在通达信上实现免费缠论分析插件

缠论终极自动化解决方案:5分钟在通达信上实现免费缠论分析插件

缠论终极自动化解决方案:5分钟在通达信上实现免费缠论分析插件 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 还在为复杂的缠论分析而烦恼吗?ChanlunX缠论插件为你提供了一套完整…

2026/7/6 1:57:44 阅读更多 →
RTVS 1.3.0 阿里云 CentOS 7.8 部署:5分钟完成 Docker 网络与端口映射配置

RTVS 1.3.0 阿里云 CentOS 7.8 部署:5分钟完成 Docker 网络与端口映射配置

RTVS 1.3.0 在阿里云CentOS 7.8上的高效部署指南:Docker网络与端口映射实战1. 环境准备与基础配置在阿里云CentOS 7.8上部署RTVS视频平台前,需要完成以下基础环境配置。选择CentOS 7.8是因为其长期支持周期和稳定的内核版本,能够完美兼容Dock…

2026/7/6 1:57:44 阅读更多 →
最小权限原则实战:从Linux进程到云原生的五层权限收缩

最小权限原则实战:从Linux进程到云原生的五层权限收缩

1. 项目概述:为什么“最小权限”不是一句空话,而是系统防线的第一道闸门“Principle of Least Privilege”——中文常译作“最小权限原则”,但这个词组在实际运维现场、安全审计会议或开发复盘会上,从来不是PPT里一个被轻描淡写划…

2026/7/6 1:55:42 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻