宏的使用不对

liuzu2016 2013-03-27 08:20:11
error C2664: “MakeSureDirectoryPathExists”: 不能将参数 1 从“TCHAR [13]”转换为“PCSTR”







int main ()
{

#ifdef _UNICODE
#undef _UNICODE //我已经取消掉了,那么TCHAR则是char!!!


TCHAR strDirectory[]=_T("c:\\1111\\222\\");

if (!PathFileExists(strDirectory))
{

char strTemp[MAX_PATH]={0};

// _tcsncpy(strTemp,strDirectory,lstrlen(strDirectory));

//PathRemoveBackslash(strDirectory);

//PathAddBackslash(strDirectory);

MakeSureDirectoryPathExists(strDirectory); //error,取消掉宏了,为什么还出错?

}
#endif


return 0;

}

...全文
171 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zrdongjiao 2013-04-01
  • 打赏
  • 举报
回复
引用 7 楼 omega_sta 的回复:
引用 4 楼 liuzu2016 的回复:引用 2 楼 ganpengjin1 的回复:换成TCHAR就行了 怎么无关? 取消这个宏后,自然就是多字节了 那么 TCHAR就变成了char了。 你搞错宏的用法了, 要注意宏定义的顺序 因为TCHAR在_UNICODE定义取消前已经为宽字符了, 之后再取消_UNICODE定义不会影响之前TCHAR的定……
第二个问题: 宏是全局定义的,那么我在某个函数里取消这个宏,会不会影响到其他函数使用这个宏呢?
Saingel 2013-04-01
  • 打赏
  • 举报
回复
引用 4 楼 liuzu2016 的回复:
引用 2 楼 ganpengjin1 的回复:换成TCHAR就行了 怎么无关? 取消这个宏后,自然就是多字节了 那么 TCHAR就变成了char了。
你搞错宏的用法了, 要注意宏定义的顺序 因为TCHAR在_UNICODE定义取消前已经为宽字符了, 之后再取消_UNICODE定义不会影响之前TCHAR的定义
liuzu2016 2013-04-01
  • 打赏
  • 举报
回复
zrdongjiao 2013-04-01
  • 打赏
  • 举报
回复
引用 10 楼 omega_sta 的回复:
其实都在于一个顺序问题
懂了,对于取消一个宏, 编译器只看第一次定义的时候, 不会看中途的代码的。 而对于中途修改宏的值, 这才管用 ps
zrdongjiao 2013-04-01
  • 打赏
  • 举报
回复
引用 9 楼 omega_sta 的回复:
引用 8 楼 zrdongjiao 的回复:引用 7 楼 omega_sta 的回复:引用 4 楼 liuzu2016 的回复:引用 2 楼 ganpengjin1 的回复:换成TCHAR就行了 怎么无关? 取消这个宏后,自然就是多字节了 那么 TCHAR就变成了char了。 你搞错宏的用法了, 要注意宏定义的顺序 因为TCHAR在_UNICODE……
可她是预编译宏啊, 编译的时候,就已编译器就已经让main函数了的; int main () { #ifdef _UNICODE #undef _UNICODE //我已经取消掉了,那么TCHAR则是char!!! TCHAR strDirectory[]=_T("c:\\1111\\222\\"); if (!PathFileExists(strDirectory)) { char strTemp[MAX_PATH]={0}; // _tcsncpy(strTemp,strDirectory,lstrlen(strDirectory)); //PathRemoveBackslash(strDirectory); //PathAddBackslash(strDirectory); MakeSureDirectoryPathExists(strDirectory); //error,取消掉宏了,为什么还出错? } #endif 这里的宏给取消了,同时, TCAHR编译器也认为是CHAR ,非WCHAR. 并表示代码之前到这里,才把TCHAR认为是Char
Saingel 2013-04-01
  • 打赏
  • 举报
回复
其实都在于一个顺序问题
Saingel 2013-04-01
  • 打赏
  • 举报
回复
引用 8 楼 zrdongjiao 的回复:
引用 7 楼 omega_sta 的回复:引用 4 楼 liuzu2016 的回复:引用 2 楼 ganpengjin1 的回复:换成TCHAR就行了 怎么无关? 取消这个宏后,自然就是多字节了 那么 TCHAR就变成了char了。 你搞错宏的用法了, 要注意宏定义的顺序 因为TCHAR在_UNICODE定义取消前已经为宽字符了, 之后再取消_U……
取消这个宏只对宏本身有效 就比如 int i = 1; int j = 2; if (i==1) { j = 3 } i = 2//这里不会因为i=2了j会从3变成2
liuzu2016 2013-03-28
  • 打赏
  • 举报
回复
引用 4 楼 liuzu2016 的回复:
[quote=引用 2 楼 ganpengjin1 的回复:] 换成TCHAR就行了
怎么无关? 取消这个宏后,自然就是多字节了 那么 TCHAR就变成了char了。[/quote] MakeSureDirectoryPathExists的参数类型是char* 其只有这个版本, 既然tchar变成char 为什么不成功 第二个问题: 宏是全局定义的,那么我在某个函数里取消这个宏,会不会影响到其他函数使用这个宏呢?
liuzu2016 2013-03-28
  • 打赏
  • 举报
回复
引用 2 楼 ganpengjin1 的回复:
换成TCHAR就行了
怎么无关? 取消这个宏后,自然就是多字节了 那么 TCHAR就变成了char了。
傻傻不解释 2013-03-27
  • 打赏
  • 举报
回复
TCHAR
漫步者、 2013-03-27
  • 打赏
  • 举报
回复
换成TCHAR就行了
漫步者、 2013-03-27
  • 打赏
  • 举报
回复
引用 楼主 liuzu2016 的回复:
error C2664: “MakeSureDirectoryPathExists”: 不能将参数 1 从“TCHAR [13]”转换为“PCSTR” int main () { #ifdef _UNICODE #undef _UNICODE //我已经取消掉了,那么TCHAR则是char!!! TCHAR strDirectory[]=_T("c:\\1111\\222\\"); if (!PathFileExists(strDirectory)) { char strTemp[MAX_PATH]={0}; // _tcsncpy(strTemp,strDirectory,lstrlen(strDirectory)); //PathRemoveBackslash(strDirectory); //PathAddBackslash(strDirectory); MakeSureDirectoryPathExists(strDirectory); //error,取消掉宏了,为什么还出错? } #endif return 0; }
跟那个宏没有关系,与你的api参数有关

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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