C++ MSVC dll 编译错误缺少类型说明符和重新定义

Posted

技术标签:

【中文标题】C++ MSVC dll 编译错误缺少类型说明符和重新定义【英文标题】:C++ MSVC dll compiling error missing type specifier and redefinition 【发布时间】:2016-08-23 21:22:09 【问题描述】:

我正在使用 Microsoft Visual Studio Community 2015 Update 3 并正在编译一个 dll。我想调用函数 InitPreySplitPipe 我已经尝试使用 ::pr::InitPreySplitPipe 调用它,我将 interprocess.cpp 代码复制到 game_local.cpp 并将 interprocess.hpp 代码复制到 game_local.h 并从那里调用它但是没有用要么。

如果有人感兴趣,我已经设置了一个GitHub repository,其中包含所有代码。

感谢阅读,抱歉我的英语不好:/

编译器输出:

Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int
Error C2371 'pr::InitPreySplitPipe': redefinition; different basic types
Error C2556 'int InitPreySplitPipe(void)': overloaded function differs only by return type from 'void pr::InitPreySplitPipe(void)'

interprocess.hpp

namespace pr

(...)
void InitPreySplitPipe();
(...)

interprocess.cpp

#include "interprocess.hpp"

namespace pr

(...)
    void InitPreySplitPipe()
    
        pipe_preysplit = CreateNamedPipe("\\\\.\\pipe\\" PREYSPLIT_PIPE_NAME,PIPE_ACCESS_OUTBOUND | FILE_FLAG_OVERLAPPED, PIPE_TYPE_MESSAGE | PIPE_REJECT_REMOTE_CLIENTS, 1, 256 * 1000, 0, 0, NULL);
        if (pipe_preysplit == INVALID_HANDLE_VALUE)
        
            return;
        

        std::memset(&overlapped, 0, sizeof(overlapped));
        overlapped.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
        if (overlapped.hEvent == NULL)
        
            pipe_preysplit = INVALID_HANDLE_VALUE;
        
    
(...)

// 函数应该在哪里调用

game_local.cpp

(...)
#include "../PreyRun/interprocess.hpp"
pr::InitPreySplitPipe();
(...)

【问题讨论】:

c-tag 有什么特别的原因,还是你只是觉得这个标签美观? 获得此错误的一种方法是在全局范围内进行调用,在任何函数之外。另一种是循环包含,其中两个 .hpp 文件尝试相互包含。 【参考方案1】:

在game_local.cpp中:

// PreyRun BEGIN
#include "../PreyRun/interprocess.hpp"
pr::InitPreySplitPipe();
// PreyRun END

您没有从任何内部调用该函数,因此编译器认为这是一个新的函数声明。因此假定int 类型,其中重载函数int pr:InitPreySplitPipe() 与您的void pr::InitPreySplitPipe() 冲突。这解释了所有 3 条错误消息。

【讨论】:

@AMS 您需要将其移动到函数中,例如main()。如果您不想在main() 中使用它,那么作为其他功能的一部分。你不能只是在不知名的地方有悬空的函数调用。这不是代码的工作方式。程序如何知道何时以及为何调用它?如果你真的很困惑,我建议阅读基本的编码教程。

以上是关于C++ MSVC dll 编译错误缺少类型说明符和重新定义的主要内容,如果未能解决你的问题,请参考以下文章

C++Qt5+win10+MSVC2015 64bit构建程序,Release编译成功后使用windeployqt.exe发布程序使用于win7出现缺少MSVCP140.dll!!!

从 C++ 调用 C# dll(MSVC 编译器)

使用 MSVC 编译时 msdpb* 文件的正确用法是啥

C++ 编译错误 C2146 和 C4430

缺少类型说明符 - 声明静态成员后假定为 int 错误

dll 运行时错误(C/C++/GCC/MSVC)