MFC单文档/多视图常见错误:error C2143: syntax error : missing ';' before '*'

解决MFC单文档多视图应用编译错误
本文详细介绍了如何解决在使用MFC创建单文档多视图应用程序时遇到的编译错误,包括正确的文件包含顺序、类包含关系及避免冲突的方法。同时还提醒开发者检查所有相关.cpp文件是否正确包含了头文件。

今天,想做一个MFC单文档多视图的应用程序界面,可是开始建好工程按照多视图的要求设置好后,编译却发现以下错误,找了好久,郁闷了好久也没找出来,最后在网上找到如下解决方案,才得以脱身,真是万分感谢,收藏!

原文如下:

error C2143: syntax error : missing ';' before '*'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

在任何cpp文件的开头都按这样的顺序Include:   
   #include    "XXXDoc.h"   
   #include    "XXXView.h"   
   #include    "MainFrm.h"   
   注意,Doc的头文件一定要在最前面。这样你的xxxxView和xxxxView也可以共享一个xxxxDoc。   
   一般在Cpp中包含文件是要注意类的包含关系,被包含的类定义应该在前面。如果实在有冲突,可以在一个类的头文件中加:class    CXXXDoc;之类的空定义。这样定义过的头文件中可以用CXXXDoc申明指针,但是不能申明实际对象。

   最后,感觉作者写的不全,我再加一句,有些.cpp文件里原来没有#include   "XXXDoc.h",   需要自己添加上。

在统计二叉树节点个数、叶子节点数和深度的 C 语言代码中出现 `error C2143: syntax error : missing ';' before 'type'` 错误,可能有以下几种原因及解决方法: ### 变量定义位置问题 有些编译器使用的是 C89 标准,C89 标准要求所有变量声明必须写在前面。若在代码中有非声明语句后再定义变量,就会出现此错误。例如下面的代码: ```c #include <stdio.h> int main(void) { int i = 10; i = 8; int j = 10; // 报错 error C2143: syntax error : missing ';' before 'type' return 0; } ``` 解决方法是将所有变量声明放在函数开头,或者使用支持 C99 标准的编译器,C99 新特性允许语句和声明按任意位置顺序排序,只要遵循“先声明后使用”的原则即可[^3]。以下是调整后的代码: ```c #include <stdio.h> int main(void) { int i = 10; int j = 10; i = 8; return 0; } ``` ### 类声明遗漏分号 如果代码中存在类声明,忘记在类后面加分号也会导致该错误。不过在纯 C 语言中没有类的概念,但如果代码包含一些类似类的结构体声明,要确保结构体声明后有分号。例如: ```c typedef struct TreeNode { char data; struct TreeNode *leftChild; struct TreeNode *rightChild; } TreeNode; // 这里不能遗漏分号 ``` ### 宏定义问题 宏定义时,如果宏定义中有语句块,且在使用时出现问题,可能会引发该错误。例如宏定义中包含语句块但没有正确处理分号。 ```c #define exchange(a,b){int t; t=a;a=b;b=t} ``` 使用时要注意宏定义代入的情况,确保不会因为分号问题导致语法错误。 ### 其他语法错误 检查代码中是否存在其他遗漏分号的情况,比如语句结束处忘记加分号。 以下是之前统计二叉树相关信息的代码示例,确保变量定义等符合语法规则: ```c #include <stdio.h> #include <stdlib.h> // 二叉树节点结构定义 typedef struct TreeNode { char data; struct TreeNode *leftChild; struct TreeNode *rightChild; } TreeNode; // 创建新节点 TreeNode* createNode(char data) { TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); newNode->data = data; newNode->leftChild = NULL; newNode->rightChild = NULL; return newNode; } // 统计二叉树节点个数 int countNodes(TreeNode* root) { if (root == NULL) { return 0; } return 1 + countNodes(root->leftChild) + countNodes(root->rightChild); } // 统计二叉树叶子节点数 int countLeafNodes(TreeNode* root) { if (root == NULL) { return 0; } if (root->leftChild == NULL && root->rightChild == NULL) { return 1; } return countLeafNodes(root->leftChild) + countLeafNodes(root->rightChild); } // 计算二叉树的深度 int treeDepth(TreeNode* root) { if (root == NULL) { return 0; } int leftDepth = treeDepth(root->leftChild); int rightDepth = treeDepth(root->rightChild); return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1; } // 先序遍历 void preOrderTraversal(TreeNode* root) { if (root != NULL) { printf("%c ", root->data); preOrderTraversal(root->leftChild); preOrderTraversal(root->rightChild); } } // 中序遍历 void inOrderTraversal(TreeNode* root) { if (root != NULL) { inOrderTraversal(root->leftChild); printf("%c ", root->data); inOrderTraversal(root->rightChild); } } int main() { // 构建一个简单的二叉树 TreeNode* root = createNode('A'); root->leftChild = createNode('B'); root->rightChild = createNode('C'); root->leftChild->leftChild = createNode('D'); root->leftChild->rightChild = createNode('E'); // 统计节点个数 int nodeCount = countNodes(root); printf("二叉树的节点个数: %d\n", nodeCount); // 统计叶子节点数 int leafCount = countLeafNodes(root); printf("二叉树的叶子节点数: %d\n", leafCount); // 计算二叉树的深度 int depth = treeDepth(root); printf("二叉树的深度: %d\n", depth); // 先序遍历 printf("先序遍历结果: "); preOrderTraversal(root); printf("\n"); // 中序遍历 printf("中序遍历结果: "); inOrderTraversal(root); printf("\n"); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值