问题是关于普通c函数,而不是c ++ static方法,正如评论中所阐明的那样.
好的,我理解static变量是什么,但什么是static函数?
为什么如果我声明一个函数,让我们说void print_matrix,让我们说a.c(WITHOUT a.h)和include "a.c"- 我得到"print_matrix@@....) already defined in a.obj",但是如果我声明它static void print_matrix然后它编译?
更新只是为了清理 - 我知道包括.c很糟糕,正如你们许多人指出的那样.我只是做它在暂时清除空间main.c,直到我有更好的想法如何将所有这些功能集成到适当.h和.c文件.只是一个临时的快速解决方案.
我试图理解为什么以下是一个错误:
class Foobar {
public:
static void do_something();
};
static void Foobar::do_something() {} // Error!
int main() {
Foobar::do_something();
}
Run Code Online (Sandbox Code Playgroud)
这个错误带有"错误:无法声明成员函数'静态void Foobar :: do_something()'在g ++中具有静态链接",并且"错误:'静态'只能在clang ++中的类定义中指定".
我理解解决这个问题的方法是在第6行的do_something定义中删除"static".但是,我不理解为什么这是一个问题.这是一个世俗的原因,例如"C++语法决定如此",还是更复杂的事情?
我正在努力让这项工作正常进行,但似乎有一些我不完全理解的事情。
\n\n我在一个文件中有一个多线程应用程序(2个类和我在其中创建线程和所有内容的真正的主程序)。我想分成3个文件。一个用于每个类(及其标题),一个用于主类。
\n\n我有几个 mutices 和一个队列来在线程之间共享消息并随时锁定和解锁它们。
\n\n我想编写一个单例类,以便所有类都可以共享互斥锁:
\n\n标头:
\n\n#ifndef COMMONSINGLETON_H\n#define COMMONSINGLETON_H\n\n#include <mutex> // std::mutex\n#include <queue>\n\nclass CommonSingleton{\n private:\n static std::mutex mutex_w_b;\n //static std::mutex mutex_wifi_ok;\n //static std::queue <std::string> queue_w_b;\n\n public:\n static CommonSingleton& getInstance();\n std::mutex GetMutexWB();\n //std::mutex GetMutexWiFiOk();\n //std::queue <std::string> GetQueueWB();\n private:\n CommonSingleton() {};\n CommonSingleton(CommonSingleton const&);\n void operator=(CommonSingleton const&);\n};\n#endif\nRun Code Online (Sandbox Code Playgroud)\n\n我的 .cpp 文件:
\n\n#include "commonsingleton.h"\n\nstatic CommonSingleton& CommonSingleton::getInstance(){\n static CommonSingleton instance;\n return instance;\n}\nstd::mutex CommonSingleton::GetMutexWB(){\n return mutex_w_b;\n}\n/*std::mutex CommonSingleton::GetMutexWiFiOk(){\n return mutex_wifi_ok;\n}\nstd::queue <std::string> CommonSingleton::GetQueueWB(){\n return queue_w_b;\n}*/\nRun Code Online (Sandbox Code Playgroud)\n\n在我的主要内容中,我有这个来测试互斥体:
\n\nCommonSingleton::getInstance().GetMutexWB.lock();\nRun Code Online (Sandbox Code Playgroud)\n\n但现在我评论了,只是为了弄清楚如何编译。这是我得到的错误: …
我有一个程序,其中类T具有静态函数.
static void T::func()
{
m_i=10;
cout<<m_i<<endl;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在函数定义中添加静态时,编译器抛出错误错误:无法声明成员函数'static void T :: func()'具有静态链接.为什么在定义中不接受静态关键字?