C++编程中带有“update”字眼的文件名不能随便起——记录一次错误命名带来的麻烦

    大家都知道,一般而言,在windows系统中,为新创建的文件命名时,在保证后缀合法的基础上,还要保证文件名本身也合法,比如不能含有某些符号和空格等。但在某些情况下,即使已经将文件命名为合法的名称,仍然存在出现问题的可能,比如下面就会谈到我今天所遇到的情况。

    事情的背景故事是这样的。我,一个C++初学者,在“CodeBlocks”软件下,参考《C++ Primer Plus》进行一些练习。当我为了测试“i++”与“++i”在“for循环”头部的表达式中所产生的效果的区别时(其实是没有区别的),创建了一个名为 “for_update_test.cbp”(起这个名字,是因为“i++”可以被认为是“for循环”头部的“update-expression”部分) 的C++ console 项目,并在该项目下面进行编程和测试。我打开了source下面的main()部分并进行了简单的编程,代码如下:

#include <iostream>

using namespace std;

int main()
{
    int a[5] ={1,2,3,4,5};

    cout << "the situation of i++" << endl;
    for (int i=0;i<5;i++)
    {
        cout << a[i] << endl;
    }

    cout << "the situation of ++i" << endl;
    for (int i=0;i<5;++i)
    {
        cout << a[i] << endl;
    }

    cin.get();
    return 0;
}

    这当然是一些最基本的内容,大家谁都会。但在我编译然后运行程序时,出现了意想不到的结果。

    为什么会这样呢?我问我自己。

    首先,我猜测,有可能是我写错了程序吧?于是我就仔细检查了我写的内容,但确实没发现写错什么东西,而且编译时候也没有报错。

   之后,我猜测,是不是我的编译器没有设置对,但我检查了settings->compiler里面的设置,使用的是默认的GNU GCC compiler,除了新勾选的C++11这个功能,也没有任何奇怪的内容。

    然后,我猜测,也许是我的CodeBlocks软件有bug?于是我上百度和谷歌搜索我这个情况,也没有找到相同的情况。一般不能运行程序都是因为编译器有问题,但我的编译器明明是没有问题的。这就令人费解了。而且更令我惊讶的是,我试了一些以前编写的其他项目里程序,都可以完全正常的运行。

    在不知所措的情况下,我重启了我的电脑,然而重启之后这个程序依然运行不下去,依然是得到上面的结果。而我之前编写的其他项目程序依然可以运行。但在我新建的这个项目里面,我甚至连一个“hello world”都运行不了,仍然得到上面的“Process returned 4258096”,而这个错误代码根本也搜索不到。

    在重启电脑也不能解决问题的情况下,我怀疑我的CodeBlocks软件本身有问题,于是立刻卸载重装。然而重装之后,该程序依然不能运行。

    我居然连一个“hello world”都无法运行了?虽然是一个初学者,但我觉得我不能连这样一个问题都解决不掉。

    我认为,我的突破口在于我之前编写的其他项目代码仍然可用,我只有从这个“不能运行的代码”和我之前编写的“可用的代码”之间找出区别,才能找到解决问题的方法。事实上,确实也是如此。

    仔细排查了从“创建新项目”到“代码编译运行”的所有流程,我发现,这次编写的内容,除了项目名称之外,没有任何设置上的区别,因此我认为问题很大程度上是出在新创建的项目的名称上的。于是我又新创建了好几个“C++ console”项目,例如“forupdatetest.cbp”以及“for_test.cbp”和“fccc.cbp”等,然后把相同代码粘贴到它们的main()函数中进行编译运行,结果发现,“forupdatetest.cbp”项目也出现了不能运行的情况,而“for_test.cbp”和“fccc.cbp”则可以运行。

    这激起了我强烈的兴趣。难道一个项目文件名就可以影响代码的运行?!

    为了了解更多细节,我关闭了CodeBlocks软件界面,打开储存文件的路径检查文件,结果确实发现了一些线索。

    “for_update_test.cbp”所生成的.exe可执行文件居然是带有“护盾”标识的文件!

    反观“for_test.cbp”所生成的.exe可执行文件,就没有这样的标识。

    试着点开这个带“护盾”的可执行文件,会出现特殊的效果,即“是否允许更改”等字样,可以选择“是”来执行这个程序。

    之后,就出现了正常该执行该代码的结果,如下:

    之后还会弹出如下所示的一个窗口:

    我隐隐约约感觉到这个可执行文件的不寻常,感觉它有点像一些Windows系统自带的文件。我猜测,也许是“update”这个词命中了Windows系统的一些检测机制。也许,整个问题,就出在这个文件当中包含这个“update”词汇上。

    为此,我建立了一些新的包含“update”字眼的C++ console 项目文件来测试它们生成的可执行文件是否会出现特殊效果。结果确实如我所想。

   

    凡是“显式”或者“隐式”包含“update”字样的C++ console项目,都会生成带有“护盾”标志的可执行文件,且它们在CodeBlocks环境中都是可以正常编译,但无法正常运行的。因此我推测,CodeBlocks环境运行已经编译的代码时,其实也是在间接调用由该项目生成的可执行文件,而一旦这个可执行文件带有“护盾”,即需要更多权限才能打开时,CodeBlocks环境就无法正常运行这个程序。

    与之形成对比的是不带有“update”字样或者错误拼写“update”字样的项目文件,都不会生成带有“护盾”的可执行文件。

    这说明了什么?

    我的推断是:Windows系统会自动识别显式或者隐式带有“update”字眼的可执行文件,并在用户运行该文件前进行询问,目的可能是保护系统或者其他我所不了解的功能。而我这次恰好由于建立了带有“update”字眼的项目并生成了带有“update”字眼的可执行文件,导致了CodeBlocks环境无法正常运行编译好的程序。

    这次意外导致我花费了几个小时去排查问题,过程很崩溃、很郁闷,但结果还算比较圆满。虽然没能彻底弄清楚里面的机制,但至少明白了一点,就是“给项目命名时绝对不要出现‘update’字眼”,因为这样会让计算机自动生成带有“护盾”的可执行程序(经调查,这个“护盾”功能是系统生成的防止其他软件未经授权自动运行的),会导致后期的运行时出现一些小问题。

    通过这次经历,我深深体会到,我们学习编程,除了了解代码的写法,更应该增加对计算机本身的了解。毕竟计算机是一个我们出生之前几十年就被发明出来的一种设备,其中绝大部分结构和功能对我们来说都是“黑箱系统”,是只可以见其运行结果而不可见其运行过程的。

    我觉得,如果希望能够更好地利用这个博大精深的工具,那么最好的办法就是了解它的内部设计,让这个“黑箱系统”变成“灰箱系统”,甚至“白箱系统”。只有在“知己知彼”的情况下,才能让我们设计的程序发挥出它最好的效果,实现“计算机为人服务”的最终目的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值