如何在编译时 发现文件不存在?

Cyberlark 2009-12-02 10:09:25
如何在编译时 发现文件不存在?

在一个可能性很小发生的if语句中,如果想使用
chiken->initialize("abc.png");
但是abc.png并不存在,如何可以在编译时候发现此类错误,否则在运行时,只要没有执行到这条if,程序将正常运行,可一旦运行了,程序就瘫痪了,如何降低这类风险?请指教!

...全文
198 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
老吴笔记 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 daiwei920 的回复:]
引用 2 楼 laowu_ 的回复:
编译时不行吧
不过你可以在initialize函数里增加判断啊,检查一下有没有这个文件,没有的话做出适当的容错处理就行了.

最新的C++标准里好像有个static_assert,这个可以在编译时检查,不知道这样行不行,我也没有试过

C/C++ codebool b= chiken->initialize("abc.png");
static_assert(b);


s是这个意思,我刚才在找 static_assert 的资料,是不是要另加一个包啊?
[/Quote]
我也不知道,刚才试了一下,没有编译通过,而在模板里是可以的.不知道是不是只能在模板里使用呢.
我觉得7楼的办法可行.
如果资源不是太多的话,不是太在意应用程序大小的话,可以考虑用10楼的方法用资源.
Cyberlark 2009-12-02
  • 打赏
  • 举报
回复
对的,可是,编译时无法知道lpFileName 是不是存在,所以只有当你调用initialize的时候才知道错误,那时候就迟了

[Quote=引用 7 楼 laowu_ 的回复:]
引用 3 楼 daiwei920 的回复:
没理解我的意思,
编译时候不会出错,但是运行时因为找不到文件 就GAME OVER了,
我现在试图找一种方法可以在编译时发现此类错误,请教高人


这样不行吗?如果不行,我也没办法了.
C/C++ codebool initialize(LPCSTR lpFileName)
{if (!IsExist(lpFileName))
{char szMsg[128]= {0};
sprintf(,"%s 文件不存在,请检查!", lpFileName);
::MessageBox(NULL, szMsg,"ERROR", MB_OK);returnfalse;
}// 如果存在,继续处理...// ...returntrue;
}
[/Quote]
Cyberlark 2009-12-02
  • 打赏
  • 举报
回复
是c++程序
[Quote=引用 10 楼 zhouzhipen 的回复:]
引用 5 楼 dijkstar 的回复:
如果你想在vc的ide环境中实现你的逻辑,应该勾连ctrl+F5(或者那个编译图标),勾连的内容是自己编写一段检测图片文件是否存在的函数。但好像微软没有留给你这个编程接口!

如果使用批处理,可以实现你要的逻辑,先研究一下命令行下的批处理文件格式makefile,也是先判断图片文件是否存在(makefile里不一定有这样的命令,弄不好还是需要自己写判断函数),再根据结果向下判断是否调用cl编译下面得内容;


感觉你想要的逻辑不合理:不应该交给执行时的任务,却交个了编译时!




可以把文件加入到资源中.
[/Quote]
zhouzhipen 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dijkstar 的回复:]
如果你想在vc的ide环境中实现你的逻辑,应该勾连ctrl+F5(或者那个编译图标),勾连的内容是自己编写一段检测图片文件是否存在的函数。但好像微软没有留给你这个编程接口!

如果使用批处理,可以实现你要的逻辑,先研究一下命令行下的批处理文件格式makefile,也是先判断图片文件是否存在(makefile里不一定有这样的命令,弄不好还是需要自己写判断函数),再根据结果向下判断是否调用cl编译下面得内容;


感觉你想要的逻辑不合理:不应该交给执行时的任务,却交个了编译时!


[/Quote]

可以把文件加入到资源中.
Cyberlark 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 laowu_ 的回复:]
编译时不行吧
不过你可以在initialize函数里增加判断啊,检查一下有没有这个文件,没有的话做出适当的容错处理就行了.

最新的C++标准里好像有个static_assert,这个可以在编译时检查,不知道这样行不行,我也没有试过

C/C++ codebool b= chiken->initialize("abc.png");
static_assert(b);
[/Quote]

s是这个意思,我刚才在找 static_assert 的资料,是不是要另加一个包啊?
老吴笔记 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dijkstar 的回复:]
上面最后一行写错了,应该是:本应该交给执行时的任务,却交个了编译时!

你想的逻辑在linux下易实现。
[/Quote]
那也不容易写啊,怎么能知道程序里面引用了哪些图片呢?
老吴笔记 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 daiwei920 的回复:]
没理解我的意思,
编译时候不会出错,但是运行时因为找不到文件 就GAME OVER了,
我现在试图找一种方法可以在编译时发现此类错误,请教高人
[/Quote]

这样不行吗?如果不行,我也没办法了.

bool initialize(LPCSTR lpFileName)
{
if (!IsExist(lpFileName))
{
char szMsg[128] = {0};
sprintf(, "%s 文件不存在,请检查!", lpFileName);
::MessageBox(NULL, szMsg, "ERROR", MB_OK);
return false;
}

// 如果存在,继续处理...
// ...
return true;
}

dijkstar 2009-12-02
  • 打赏
  • 举报
回复
上面最后一行写错了,应该是:本应该交给执行时的任务,却交个了编译时!

你想的逻辑在linux下易实现。
dijkstar 2009-12-02
  • 打赏
  • 举报
回复

如果你想在vc的ide环境中实现你的逻辑,应该勾连ctrl+F5(或者那个编译图标),勾连的内容是自己编写一段检测图片文件是否存在的函数。但好像微软没有留给你这个编程接口!

如果使用批处理,可以实现你要的逻辑,先研究一下命令行下的批处理文件格式makefile,也是先判断图片文件是否存在(makefile里不一定有这样的命令,弄不好还是需要自己写判断函数),再根据结果向下判断是否调用cl编译下面得内容;


感觉你想要的逻辑不合理:不应该交给执行时的任务,却交个了编译时!

yuhudie203 2009-12-02
  • 打赏
  • 举报
回复
如果你有良好的编码规范可以解决这个问题
比如你指定路径的图片设置 你可以在设置之前做一个路径的判断
看看图片是否存在
如果存在 继续
如果不存在 返回 并弹出对话框“指定路径图片不存在”
Cyberlark 2009-12-02
  • 打赏
  • 举报
回复
没理解我的意思,
编译时候不会出错,但是运行时因为找不到文件 就GAME OVER了,
我现在试图找一种方法可以在编译时发现此类错误,请教高人
老吴笔记 2009-12-02
  • 打赏
  • 举报
回复
编译时不行吧
不过你可以在initialize函数里增加判断啊,检查一下有没有这个文件,没有的话做出适当的容错处理就行了.

最新的C++标准里好像有个static_assert,这个可以在编译时检查,不知道这样行不行,我也没有试过

bool b = chiken->initialize("abc.png"); 
static_assert(b);
Ryanwen 2009-12-02
  • 打赏
  • 举报
回复
用绝对路径不就没这个问题了?

一个图片文件不能获取就瘫痪整个程序,这个似乎有点过分

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧