visual studio2022报错:error C2143: 语法错误: 缺少“;”(在“{”的前面),error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 i

系列文章目录

前言

1.在使用MFC win32编程时,编译器莫名报各种编译错误,首先自己写的代码明明没错,但编译器报各种与代码语法相关的错误,比如:
在这里插入图片描述
在这里插入图片描述

error C2143: 语法错误: 缺少“;”(在“‘template<’”的前面)

error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\ucrt\assert.h(17,1): error C2144: 语法错误:“int”的前面应有“;”

1>E:\code\workspace\soui4\SOUI\include\core\ssingleton.h(63,1): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

1>E:\code\workspace\soui4\SOUI\include\interface\SResProviderMgr-i.h(11,81): error C3861: “_T”: 找不到标识符

1>E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(6,16): error C2079: “SLayoutSize”使用未定义的 class“SOUI::SOUI_EXP”

1>E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(7,3): error C2059: 语法错误:“public”

1>E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(9,5): error C2143: 语法错误: 缺少“;”(在“{”的前面)

1>E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(9,5): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)

1>E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(17,5): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

1>E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(17,5): error C2365: “SOUI::SLayoutSize”: 重定义;以前的定义是“数据变量”

1> E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(6,16):
1> 参见“SOUI::SLayoutSize”的声明
1>E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(19,30): error C2061: 语法错误: 标识符“Unit”

1>E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(19,5): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

1>E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(19,5): error C2365: “SOUI::SLayoutSize”: 重定义;以前的定义是“数据变量”

1> E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(6,16):
1> 参见“SOUI::SLayoutSize”的声明
1>E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(21,5): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

1>E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(21,10): error C2146: 语法错误: 缺少“;”(在标识符“unit”的前面)

1>E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(24,10): error C2270: “isWrapContent”: 非成员函数上不允许修饰符

1>E:\code\workspace\soui4\SOUI\include\layout\SLayoutSize.h(27,10): error C2270: “isMatchParent”: 非成员函数上不允许修饰符

1>E:\code\workspace\soui4\utilities\include\soui_mem_wrapper.h(14,1): error C1003: 错误计数超过 100;正在停止编译
1>(编译源文件“FileOperator.cpp”)

一、分析错误原因

跟win32预编译头有关,首先在工程中我使用了开源库SOUI界面库,SOUI是基于MFC win32的界面库
宏定义:
stdafx.h 可能包含了对 SOUI_EXP 宏的定义。如果 SOUI_EXP 是一个宏,在 SNamedValue.h 或其他头文件中被用来修饰类声明或其他定义,那么缺少这个宏定义就会导致语法错误。例如:
cpp
深色版本
#define SOUI_EXP extern “C” __declspec(dllexport)
如果 SNamedValue.h 中有类似下面的代码:
cpp
深色版本
SOUI_EXP class SNamedString {
public:
SNamedString();
~SNamedString();
private:
std::string m_value;
};
那么缺少 SOUI_EXP 的定义会导致编译错误。
其他预处理指令:
stdafx.h 可能包含了其他预处理指令,如条件编译指令 (#ifdef, #ifndef, #define, #endif),这些指令能够正确地控制某些代码块的编译与否。
依赖的头文件:
stdafx.h 可能包含了其他重要的头文件,这些头文件中定义了一些必要的类型或宏,使得后续的头文件能够正确编译。
如何验证?
为了验证这一点,你可以检查 stdafx.h 文件的内容,看看里面是否包含以下几项:

宏定义:
查看 SOUI_EXP 是否在这个文件中被定义。
预处理指令:
检查是否有其他预处理指令,如 #ifdef, #ifndef, #define, #endif。
其他头文件:
查看是否有其他的头文件被包含进来,这些头文件是否提供了必要的类型或宏定义。
示例代码
假设 stdafx.h 包含以下内容:

cpp
深色版本
// stdafx.h
#ifndef STDAFX_H
#define STDAFX_H

// 定义 SOUI_EXP
#define SOUI_EXP extern “C” __declspec(dllexport)

#endif // !STDAFX_H
总结
加入 #include “stdafx.h” 后,程序不再报错,通常是因为 stdafx.h 提供了必要的宏定义或其他预处理指令,使得原本的语法错误得以解决。你可以查看 stdafx.h 的内容来确认具体原因,并确保其他相关头文件也包含了必要的定义。