Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数指针多定义_C++ - Fatal编程技术网

C++ 函数指针多定义

C++ 函数指针多定义,c++,C++,我有以下代码: Header.hpp: #ifndef HEADER_HPP_INCLUDED #define HEADER_HPP_INCLUDED #include<Windows.h> extern HMODULE Module; extern "C" bool __stdcall Initialized(void); void (__stdcall *ptr_DetourPoint) (int X, int Y); #endif //HEADER_HPP_INCLUDED

我有以下代码:

Header.hpp:

#ifndef HEADER_HPP_INCLUDED
#define HEADER_HPP_INCLUDED
#include<Windows.h>

extern HMODULE Module;
extern "C" bool __stdcall Initialized(void);
void (__stdcall *ptr_DetourPoint) (int X, int Y);

#endif //HEADER_HPP_INCLUDED

知道我为什么会这样吗?我不想必须键入我的函数指针。

简单的回答是ptr_DetourPoint声明了一个全局函数指针,另一个类似模块的数据块。要修复它,还可以将其标记为extern。但我怀疑您是否需要在标题中公开它,因为它似乎只是header.cpp中的一个实现细节。

简单的回答是ptr_DetourPoint声明了一个全局函数指针,另一个类似模块的数据块。要修复它,还可以将其标记为extern。但我怀疑您是否需要在标头中公开它,因为它似乎只是header.cpp中的一个实现细节。

该变量在标头中定义,这意味着包含它的任何源文件都定义了该符号。结果是,将main.cpp和Header.cpp链接在一起会两次定义ptr_迂回点。您只需要在一个源文件中定义它,如果其他文件需要查看它,则需要在头文件中将它声明为extern。

该变量在头文件中定义,这意味着包含它的任何源文件都定义了该符号。结果是,将main.cpp和Header.cpp链接在一起会两次定义ptr_迂回点。您只需要在一个源文件中定义它,如果其他文件需要查看,则在头文件中将其声明为extern。

但是如果我放置extern,则在头文件中显示undefined reference.cpp:S,这是否意味着我需要将相同的代码再次复制到.cpp文件中?是的,您需要在cpp文件中不包含extern的同一行。但是如果我放置extern,则在头文件中显示undefined reference。cpp:S确实如此这意味着我需要将相同的代码再次复制到.cpp文件中?是的,您需要在cpp文件中使用相同的行而不使用extern。
#include "Header.hpp"
HMODULE Module = nullptr;

bool __stdcall Initialize(void)
{
    Module = LoadLibrary("Point.dll");
    ptr_DetourPoint = reinterpret_cast<(__stdcall *)(int, int)>(GetProcAddress(Module, "PointFunc"));
    return ptr_DetourPoint != nullptr;
}

extern "C" __stdcall HookDetourPoint(int X, int Y)
{
    //Do stuff here..
    ptr_DetourPoint(X, Y);
}
#include <windows.h>
#include "Header.hpp"

extern "C" bool __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            Initialized();
            DisableThreadLibraryCalls(hinstDLL);
            break;

        case DLL_PROCESS_DETACH:
            break;

        default:
            break;
    }
    return true;
}
obj\Release\main.o:main.cpp:(.bss+0xb78): multiple definition of `ptr_DetourPoint'
obj\Release\Implementations\Header.o:Header.cpp:(.bss+0xb80): first defined here