VS error: C2859 C1083 .

本文详细介绍了在Visual C++ 2005中遇到预编译头错误C2859及LNK2001的过程与解决方法。通过调整预编译头设置和正确配置stdafx.cpp文件,成功解决了编译问题。

今天在VC2005中修改一个工程的文件结构,将"stdafx.cpp"文件挪动了位置,编译时出现C2859错误,具体信息如下:

error C2859: e:\projects\apptest\src\debug\vc80.pdb is not the pdb file that was used when this precompiled header was created, recreate the precompiled header. e:\projects\apptest\src\mainapp.cpp 4 

error C2859: e:\projects\apptest\src\debug\vc80.idb is not the idb file that was used when this precompiled header was created, recreate the precompiled header. e:\projects\apptest\src\mainapp.cpp 4 

按照提示要求,clean编译文件,rebuild工程,还是一样的问题。发现debug文件夹下总是有一个mainapp.pch文件(预编译文件),即使clean也不会删除。将该文件手动删除,rebuild工程,出现C1083错误:

fatal error C1083: Cannot open precompiled header file: 'Debug\MainApp.pch': No such file or directory e:\projects\apptest\src\mainapp.cpp 4 

查看工程设置properties -> Configuration Properties -> C/C++ -> Precompiled Headers,为“Use Precompiled Headers (/Yu)”,所以预编译文件mainapp.pch不会自动生成;改为“Create Precompiled Headers (/Yc)”,rebuild工程,ok。

但是工程原来的设置“Use Precompiled Headers (/Yu)”是可以编译成功的啊,于是再改回原来的设置,build,出现LNK2001错误:

error LNK2001: unresolved external symbol "int __cdecl _AfxInitManaged(void)" (?_AfxInitManaged@@YAHXZ) mfcs80ud.lib 

百思不得其解,google上找答案,原来VC对于预编译的设置是这样的:

1、"stdafx.cpp"文件的预编译选项永远是“Create Precompiled Headers (/Yc)”;

2、工程的预编译选项一般为“Use Precompiled Headers (/Yu)”。

可知"stdafx.cpp"文件的预编译选项一般与工程的预编译选项设置是不同的,也就是说每次build工程时,"stdafx.cpp"文件都要生成预编译文件*.pch,而其他cpp文件则直接用这个文件进行编译。于是选中"stdafx.cpp"文件,右键“Properties”,选择 “All Configurations”,将预编译选项设置为“Create Precompiled Headers (/Yc)”,再次rebuild,一切ok。

回忆引起出错的操作,是从工程中删除"stdafx.cpp"文件后又添加到工程中的。看来VC框架生成的工程会自动将"stdafx.cpp"文件的预编译选项设置好,如果用户手动添加该文件的话,预编译选项将会与工程的选项相同。打开一个以前的MFC工程查看,果然验证了自己的想法。

 

转自:http://blog.youkuaiyun.com/shendu369/article/details/6923520

```markdown 你遇到的这些错误: ``` error C2143: syntax error : missing ';' before 'type' error C2065: 'reversed' : undeclared identifier ``` 是因为你在 **Visual C++ 6.0 或较老的 C 编译器**中使用了“**在代码中间定义变量**”的方式,而老版本 C 标准(如 C89)**要求所有变量必须在函数开头集中声明**! --- ### ✅ 解决方法:把变量定义全部移到最前面! 下面是**完全兼容老编译器(如 VC6)的修正版程序**: ```c #include <stdio.h> int main() { long int n; int reversed; // 全部变量提前定义 int sum; int digit; printf("请输入一个数:"); scanf("%ld", &n); reversed = 0; // 初始化 sum = 0; while (n != 0) { digit = n % 10; // 取最后一位 reversed = reversed * 10 + digit; sum = sum + digit; n = n / 10; // 去掉最后一位 } printf("\n该数的各位数之逆序为:%d", reversed); printf("\n该数的各位数之和为:%d\n", sum); return 0; } ``` --- ### ❌ 错误原因详解 你在循环前写了: ```c long int temp = n; int reversed = 0; int sum = 0; ``` 但在老式 C 编译器中,**不能在 `printf`、`scanf` 等语句之后才定义变量**。 必须像这样: ✅ 正确顺序: ```c { int a, b, c; // 所有变量先声明 float x; a = 1; // 再开始赋值和执行 printf("..."); } ``` --- ### ✅ 修改后就不会报错了! > 只要把 `reversed`、`sum`、`digit` 这些变量**全放在函数开头**,就能通过 VC6 或 TC 等老编译器! --- ### 知识点 1. **变量必须先声明再使用**:C语言不允许在语句中间突然定义新变量(旧标准)。 2. **$n \% 10$ 提取个位数字**:快速获取当前最后一位数字。 3. **$n / 10$ 去掉个位**:通过整除10逐步缩小数值,实现逐位分解。 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值