【问题标题】:Error "this declaration has no storage class or type specifier"错误“此声明没有存储类或类型说明符”
【发布时间】:2015-02-12 09:33:22
【问题描述】:

我正在使用 Visual Studio 编写我的第一个应用程序,但我不明白它向我显示的错误。

有两个文件,Session 和 Login。登录使用 Session 的 set 和 get 功能。正如您在下面看到的,Login 调用“setCurrentLang”,这是 Visual Studio 显示的消息:Login.cpp 上的“此声明没有存储类或类型说明符”。如果我编译,这就是错误:

“错误 26 错误 C2365: 'setCurrentLang' : 重新定义;之前的定义是 'function' (....)\GUI\Login.cpp”。

这是 Session.cpp 文件:

#include "Session.h"
const char* CURRENT_LANG;
void setCurrentLang( char* lang){
    CURRENT_LANG = strdup(lang);
}
const char* getCurrentLang(){
    return CURRENT_LANG;
}

会话.h

#ifndef __SESSION_H__
#define __SESSION_H__

#include <cstring>
#include <stdio.h>

void setCurrentLang( char* lang);
const char* getCurrentLang();

#endif

登录.cpp

#include "Login.h"
#include "../data/Session.h"

setCurrentLang("English"); 

非常感谢您的帮助!

【问题讨论】:

  • 请编辑您的问题以包含 completeunedited 错误输出。并指出在哪里你得到错误。
  • 选择一种语言
  • 感谢@JoachimPileborg,我已经编辑了帖子。
  • @WhozCraig 我不明白你。我不能在 C++ 上使用 C 吗?
  • 你可以在 C++ 中使用 C,但 C++ 会让你自己射击自己的腿,当你将它与 C 混合时,它甚至会给你一把上膛的霰弹枪。因此,预计很难调试问题、内存泄漏和崩溃,因为您需要跟踪内存(由于 C)和实例生命周期(由于 C++ RAII),并确保这两者完美同步。

标签: c++ c visual-studio-2013


【解决方案1】:

您在任何上下文之外调用该方法。这不可能。如果你想在启动时设置语言,你可以在 main 的开头调用它,或者使用一个在其构造函数中调用它的虚拟静态类:

static class LanguageSetter
{
public:
    LanguageSetter()
    {
        setCurrentLang("English");
    }
} dummy;

或者干脆在CURRENT_LANG的定义中设置默认值:

// std::string because this is C++, not C
std::string CURRENT_LANG = "English";

【讨论】:

  • 把功能放在一边,为什么我不能调用Login.cpp上的功能??我怎么能调用这个函数?
  • 你不能调用它,因为它没有上下文。要解决它,请阅读我的答案。
  • 是的,我想我理解你了。但是我想在开始时设置一种语言并使用一种方法来管理任何文件的会话。例如,为当前用户设置新名称或新电子邮件。这是最好的方法吗?我怎么能调用“虚拟”的功能?感谢您的耐心等待。
  • 自动调用构造函数。请注意,不同文件的初始化顺序是未定义的,因此在多个文件中使用时可能无法按预期工作。有两种方法可以解决这个问题,一种是nifty counter,另一种(也是首选)根本不这样做,而是在使用时逐步初始化所有资源。
  • 对您而言,最好的方法是在定义中指定 CURRENT_LANG 的默认值,并在您的代码为 C++ 时使用 std::stringstd::string CURRENT_LANG = "English";
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多