C++/CLI中FileAttributes位运算条件判断报错求助
解决C++/CLI中位运算判断文件属性的编译错误
问题
在C++/CLI中使用位运算判断文件Normal属性时出现编译错误,不确定是否是CLI特性支持问题。
原代码
#include "pch.h" #include <Windows.h> using namespace System; using namespace System::IO; int main(array<System::String ^> ^args) { FileInfo ^fi = gcnew FileInfo("c:\\test.txt"); if (fi->Attributes & System::IO::FileAttributes::Normal) Console::WriteLine("Attrib : normal"); else Console::WriteLine("Not normal file"); return 0; }
编译错误
- 错误 C2451: 条件表达式的类型“System::IO::FileAttributes”非法
- 活动错误 E0711: 表达式必须具有 bool 类型(或可转换为 bool)
原因与解决方案
C++/CLI中,System::IO::FileAttributes是枚举值类型,位运算&的结果仍然是FileAttributes类型,而C++/CLI不允许直接将枚举类型作为if的条件(无隐式转换为bool的规则),必须显式判断结果是否非零。
修改后的代码(方法1:判断是否不等于空枚举值)
#include "pch.h" #include <Windows.h> using namespace System; using namespace System::IO; int main(array<System::String ^> ^args) { FileInfo ^fi = gcnew FileInfo("c:\\test.txt"); // 显式判断位运算结果是否为非空枚举值 if ((fi->Attributes & System::IO::FileAttributes::Normal) != FileAttributes::None) Console::WriteLine("Attrib : normal"); else Console::WriteLine("Not normal file"); return 0; }
修改后的代码(方法2:转换为整数判断非零)
#include "pch.h" #include <Windows.h> using namespace System; using namespace System::IO; int main(array<System::String ^> ^args) { FileInfo ^fi = gcnew FileInfo("c:\\test.txt"); // 将枚举转换为int后判断位运算结果是否非零 if ((static_cast<int>(fi->Attributes) & static_cast<int>(System::IO::FileAttributes::Normal)) != 0) Console::WriteLine("Attrib : normal"); else Console::WriteLine("Not normal file"); return 0; }
这两种方法都能让编译器正确识别条件表达式的bool类型,解决编译错误。
内容的提问来源于stack exchange,提问作者teerayut d
相关产品推荐
相关产品推荐

