吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2327|回复: 17
收起左侧

[求助] [C++]include究竟应该写在.cpp里还是.h里?

[复制链接]
geleisisisi 发表于 2022-3-14 08:58
本帖最后由 geleisisisi 于 2022-3-14 09:08 编辑

最近想做一个修改器,所以用了visual studio 2022 community 版本里面自带的MFC模版。
为了不和自动生成的文件混肴,我新建了一个类,取名为Editor。然后在这个类里面写各种各样的函数,最后在Dlg.cpp文件里调用这些函数。
然后我就遇到了一个非常奇葩的问题,那就是include究竟应该写在Editor.cpp里还是Editor.h里?
通常情况下,我都是写在.cpp里。
然后我就在Editor.cpp里写了这样一个函数,用来获取模块信息:
[C++] 纯文本查看 复制代码
MODULEENTRY32 GetModuleBaseInfo(CString szModuleName, DWORD dwPid) {
        HANDLE hModuleTool = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwPid);
        MODULEENTRY32 me32 = { 0 };
        if (hModuleTool == INVALID_HANDLE_VALUE) return me32;//获取模块句柄失败
        me32.dwSize = sizeof(MODULEENTRY32);
        BOOL bRet = Module32First(hModuleTool, &me32);
        if (bRet) {
                while (bRet)
                {
                        if (wcscmp(me32.szModule, szModuleName) == 0 || wcscmp(me32.szExePath, szModuleName) == 0) {
                                return me32;
                        }
                        bRet = Module32Next(hModuleTool, &me32);
                }
        }
        return me32;
}

为了使用这个函数,我在Editor.cpp的最上方,加了#include <TlHelp32.h>
接着,我去Editor.h里,声明了该函数
[C++] 纯文本查看 复制代码
MODULEENTRY32 GetModuleBaseInfo(CString szModuleName, DWORD dwPid);

然后就报错了
1.PNG

除非我在Editor.h的最上方同样加上#include <TlHelp32.h>,它就立马不报错了
2.PNG

我现在就特迷惘,include究竟应该写在Editor.cpp里还是Editor.h里?
求大佬指点一下迷津
===========
头脑晕了,有些地方写错了,重新编辑了下

免费评分

参与人数 1热心值 +1 收起 理由
Qiudl + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

michaelgao 发表于 2022-3-14 10:59
问题的本质:C/C++编程规范,变量类型、变量、函数等等都必须遵循:先声明,后使用
MODULEENTRY32 GetModuleBaseInfo(CString szModuleName, DWORD dwPid);
GetModuleBaseInfo函数声明的返回类型MODULEENTRY32 是在TIhelp32.h文件中定义的,所以要先引入这个TIhelp32.h这个头文件,才能使用MODULEENTRY32 数据类型。
所以必须在Editor.h中引入TlHelp32.h。

“include究竟应该写在.cpp里还是.h里?” 是伪命题。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
geleisisisi + 1 + 1 谢谢@Thanks!

查看全部评分

renpeng009 发表于 2022-3-14 09:09
Frhvjhhv 发表于 2022-3-14 09:14
GetModuleBaseInfo是dbghelp.h里面的系统函数,原因是你的函数名和系统函数名重复了。导致两个函数名一样,只是函数返回值类型不同,编译器不能区分,所以报错
zhuxianling 发表于 2022-3-14 09:18
厉害,但是我觉得应该在Editor.h中
32K 发表于 2022-3-14 09:28
Editor.h吧,,,
fjqisba 发表于 2022-3-14 09:28
总结就是include能写在cpp就尽量写在cpp里面,为了避免循环引用。
LouisTong 发表于 2022-3-14 09:28
我都是寫在cpp里的,不然容易重復包含
 楼主| geleisisisi 发表于 2022-3-14 09:43
Frhvjhhv 发表于 2022-3-14 09:14
GetModuleBaseInfo是dbghelp.h里面的系统函数,原因是你的函数名和系统函数名重复了。导致两个函数名一样, ...

我试过改函数名,比如改成Get_ModuleBaseInfo,依旧还是报错,除非在.h里加include
cao1124 发表于 2022-3-14 09:46
哪用放哪,编译器能找到就行
LiangMaxwell 发表于 2022-3-14 10:25
一般都是放到.h里,然后有一些预编译指令来限制
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 14:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表