Visual Studio 2019中筛选器为何似乎会覆盖文件扩展名?
Visual Studio 2019中修改文件扩展名后拖入筛选器仍无法构建的原因
问题重现
我创建了一个测试项目,代码如下(原文件误创建为头文件,之后修改扩展名为.cpp并拖入Solution Explorer的Source Files筛选器):
struct PtrHolder { int num; int* ptr; PtrHolder(int i) { num = i; ptr = new int[i]; ptr[0] = i; } ~PtrHolder() { delete[] ptr; } }; int main(int argc, char* argv[]) { PtrHolder holder(2); PtrHolder* holderAddr = new PtrHolder(3); return 0; }
修改扩展名并拖入Source Files后,调试构建失败,构建输出显示无.cpp文件参与编译;但删除该文件重新添加正确的.cpp文件后,构建恢复正常。疑问:筛选器是否会覆盖文件扩展名?
原因解析
并非筛选器覆盖了文件扩展名,问题出在Visual Studio项目的配置记录上:
- 当你最初创建头文件(.h)并添加到项目时,项目文件(.vcxproj)中会记录该文件的类型为「头文件」,编译时会按头文件规则处理(不参与编译)。
- 仅修改物理文件的扩展名,并不会自动更新项目配置里的文件类型属性。拖入Source Files筛选器只是改变了文件在Solution Explorer中的显示分组,不会修改项目中记录的文件编译类型——项目仍然认为这是一个头文件,因此不会将其纳入.cpp文件的编译流程。
- 重新添加正确的.cpp文件时,Visual Studio会在项目配置中正确标记该文件为「C++源文件」,自然能正常参与编译。
同类场景快速解决方法
若已修改物理文件扩展名,无需删除重建:右键点击项目中的该文件 → 属性 → 在「常规」选项卡中,将「项类型」改为「C/C++编译器」,保存配置后重新构建即可。
内容的提问来源于stack exchange,提问作者Rayshaun Thompson
相关产品推荐
相关产品推荐

