语法错误:缺少;在的前面

第一种情况

在这里插入图片描述

第二种

在这里插入图片描述

这两种情况都属于类的超前引用,虽然写了宏定义#pragma once,该处理方式与编译器的预处理相关,建议编写时将公共库放入pch.h中,其他自己写的头文件就不要包含了,以免进行二次包含!

解决方案

1. 将你写的头文件从pch.h中删除。
2. 各个头文件都写上#pragma once
3. 各个cpp文件分别包含其.h文件,
4. 子类包含其父类的头文件
“qua”: 重定义;不同的类型修饰符 qua 不是模板 “constexpr”在此处无效 “int qua”: 重定义 “qua”: 重定义;不同的类型修饰符 “qua”: 重定义;多次初始化 “Q”: 重定义;以前的定义是“模板参数” “Q”: 重定义;以前的定义是“模板参数” “RAND_MAX”: 未声明的标识符 “rand”: 找不到标识符 “{”: 缺少函数标题(是否是老式的形式表?) “{”: 缺少函数标题(是否是老式的形式表?) “{”: 缺少函数标题(是否是老式的形式表?) “{”: 缺少函数标题(是否是老式的形式表?) “{”: 缺少函数标题(是否是老式的形式表?) 不可识别的模板声明/定义 不可识别的模板声明/定义 不可识别的模板声明/定义 不可识别的模板声明/定义 不可识别的模板声明/定义 不可识别的模板声明/定义 不可识别的模板声明/定义 不可识别的模板声明/定义 不可识别的模板声明/定义 内联变量至少需要 "/std:c++17" 内联变量至少需要 "/std:c++17" 内联变量至少需要 "/std:c++17" 内联变量至少需要 "/std:c++17" 内联变量至少需要 "/std:c++17" 内联变量至少需要 "/std:c++17" 内联变量至少需要 "/std:c++17" 应由“>”终止 模板参数列表,却找到“>=” 应由“>”终止 模板参数列表,却找到“>” 应由“>”终止 模板参数列表,却找到“>” 应由“>”终止 模板参数列表,却找到“>” 应输入“)” 应输入“)” 应输入声明 应输入标识符 应输入标识符 意外的类型“void” 未定义标识符 "qualifier" 特性 "nodiscard" 在此处不适用 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 语法错误: 标识符“qualifier” 语法错误: 标识符“qualifier” 语法错误: 标识符“qualifier” 语法错误: 标识符“qualifier” 语法错误: 标识符“qualifier” 语法错误: 标识符“qualifier” 语法错误: 缺少)”(在“;”的前面) 语法错误: 缺少)”(在“>”的前面) 语法错误: 缺少)”(在“>”的前面) 语法错误: 缺少“;”(在“<”的前面) 语法错误: 缺少“;”(在“<”的前面) 语法错误: 缺少“;”(在“<”的前面) 语法错误: 缺少“;”(在“<”的前面) 语法错误: 缺少“;”(在“<”的前面) 语法错误: 缺少“;”(在“<”的前面) 语法错误: 缺少“;”(在“{”的前面) 语法错误: 缺少“;”(在“{”的前面) 语法错误: 缺少“;”(在“{”的前面) 语法错误: 缺少“;”(在“{”的前面) 语法错误: 缺少“;”(在“{”的前面) 语法错误: 缺少“;”(在“{”的前面) 语法错误:)语法错误:)语法错误:)语法错误:“<” 语法错误:“<” 语法错误:“<” 语法错误:“<” 语法错误:“<” 语法错误:“>” 语法错误:“>” 语法错误:“return” 错误计数超过 100;正在停止编译
最新发布
12-03
你遇到的 **“错误计数超过 100;正在停止编译”** 是典型的 **头文件污染或宏冲突导致编译器完全错乱解析代码** 的症状。 --- ## 🔥 根本原因分析 从你的错误信息中,我们可以看到大量奇怪的关键词被误识别: - `qua`、`Q`、`RAND_MAX`、`rand` 报错; - 出现 `不可识别的模板声明/定义`; - `应输入标识符`、`缺少 ')'`、`语法错误: '<'` 等; - `内联变量至少需要 "/std:c++17"`; - `constexpr 在此处无效`; 👉 这说明:**编译器已经无法正确理解 C++ 语法结构了!** 这通常是因为: > ❗你在某个地方 **不小心把关键字或标准库名称重新定义为宏(#define)**,从而破坏了整个语言环境! --- ## ✅ 最常见罪魁祸首:`#define` 污染了关键字 ### ⚠️ 典型例子(你很可能写了类似这样的代码): ```cpp #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((b) < (a) ? (a) : (b)) ``` 或者更糟: ```cpp #define return #define class struct #define private public ``` 甚至: ```cpp #define new ``` 这些会彻底破坏 STL 和标准库! --- ## 🧪 特别怀疑点:你是否使用了某些“中文编程”风格的头文件? 比如有如下内容的 `.h` 文件: ```cpp #define 开始 { #define 结束 } #define 如果 if #define 否则 else #define 整数 int #define 返回 return #define 常量 const ... ``` 或者: ```cpp #define qua something ``` 这种宏替换会让编译器把原本的 `class` 解析成非法符号,造成 **上千个语法错误**,即使实际代码只有几十行。 --- ## ✅ 如何排查和解决? ### ✅ 步骤一:检查你自己写的 `.h` 或 `.cpp` 文件中是否有危险的 `#define` 搜索以下内容: ```cpp #define min #define max #define class #define struct #define public #define private #define new #define delete #define return #define inline #define const #define constexpr #define template #define typename #define using #define namespace #define qua // 特别注意这个!你在用它做宏吗? ``` 如果你发现类似: ```cpp #define qua xyz ``` 立刻删除它!`qua` 可能是 `quaternion` 缩写,被 glm 等数学库使用。 --- ### ✅ 步骤二:确保包含顺序正确 —— **Windows.h 后患无穷** 如果你包含了 `<windows.h>`,它内部会定义: ```cpp #define min(a,b) ... #define max(a,b) ... ``` 这会导致 `<algorithm>` 中的 `std::min` 报错! #### ✅ 解决方案: 在包含 Windows 头之前加上: ```cpp #define NOMINMAX #include <windows.h> ``` 否则你就得面对 `min/max` 宏与 STL 冲突的问题。 --- ### ✅ 步骤三:启用 C++17 并设置正确的语言标准 你看到这个警告: > `内联变量至少需要 "/std:c++17"` 说明你用了 `/std:c++14` 或更低版本。 #### ✅ 解决方法: 右键项目 → 属性 → C/C++ → 语言 → C++ 语言标准 → 设置为: ``` ISO C++17 Standard (/std:c++17) ``` 或者更高(C++20)。 --- ### ✅ 步骤四:清理并简化测试代码(最小可复现实例) 创建一个新项目,只保留最基本内容: ```cpp // main.cpp - Minimal Working Example #define STB_PERLIN_IMPLEMENTATION #include "stb_perlin.h" #include <iostream> #include <glad/glad.h> #include <GLFW/glfw3.h> int main() { std::cout << "Noise: " << stb_noise2(1.0f, 2.0f) << std::endl; return 0; } ``` 如果这个都报错,说明是环境问题。 如果这个不报错,说明原项目中有 **隐藏的坏宏或头文件污染**。 --- ## ✅ 修复后的 `stb_perlin.h` 示例(安全版) 确保你的 `stb_perlin.h` 不会引入额外宏污染: ```cpp #ifndef STB_PERLIN_H #define STB_PERLIN_H float stb_noise2(float x, float z); float stb_noise3(float x, float y, float z); #ifdef STB_PERLIN_IMPLEMENTATION #include <math.h> #include <stdlib.h> // 添加这两行!否则 rand/RAND_MAX 找不到 #include <time.h> static int perm[512] = { 151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8, 99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117, // ...(省略中间数据,保持原样) 188, 0, 0 }; // 初始化随机表(仅一次) void init_perm() { static bool initialized = false; if (!initialized) { srand((unsigned int)time(nullptr)); for (int i = 0; i < 256; ++i) { perm[i] = rand() & 255; } for (int i = 0; i < 256; ++i) { perm[256 + i] = perm[i]; } initialized = true; } } float stb_noise2(float x, float z) { init_perm(); // 初始化一次 int X = (int)floor(x) & 255; int Z = (int)floor(z) & 255; float fx = x - floor(x); float fz = z - floor(z); float u = fx * fx * (3 - 2 * fx); float v = fz * fz * (3 - 2 * fz); int A = perm[X] + Z; int AA = perm[A]; int AB = perm[A + 1]; int B = perm[X + 1] + Z; int BA = perm[B]; int BB = perm[B + 1]; float res = u * v * AA + (1 - u) * v * AB + u * (1 - v) * BA + (1 - u) * (1 - v) * BB; return res * 2 - 1; // [-1, 1] } #endif // STB_PERLIN_IMPLEMENTATION #endif // STB_PERLIN_H ``` 并在主文件顶部: ```cpp #define STB_PERLIN_IMPLEMENTATION #include "stb_perlin.h" // 必须在其他之前?不一定,但不要和其他宏混用 ``` --- ## ✅ 总结解决方案清单 | 问题 | 解决方法 | |------|----------| | `qua`, `Q` 重定义 | 删除所有自定义宏如 `#define qua` | | `rand` 找不到 | 加上 `#include <stdlib.h>` | | 超过 100 个错误 | 检查是否有中文宏或关键字覆盖 | | `constexpr` 无效 | 设置 `/std:c++17` | | `min/max` 冲突 | 使用 `#define NOMINMAX` | | 编译器错乱解析 | 创建最小示例测试 | --- ## ✅ 推荐调试流程 1. 新建空项目; 2. 只加 `main.cpp` 和 `stb_perlin.h`; 3. 包含 glad、GLFW 前先测试 noise 是否可用; 4. 确保项目属性中启用了 `/std:c++17`; 5. 逐步添加功能,避免一次性导入复杂宏系统。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值