问题是关于普通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文件.只是一个临时的快速解决方案.
我对以下问题感到困惑:如何保持"静态"标签的优势,但仍然能够在现场调试生产代码?
一旦发生意外行为发生在客户站点,并且仅在那里发生.在许多情况下,可以选择执行调试可以节省大量精力并提供非常快速的响应.这样的调试通常涉及检查函数行为,这使我们进入"静态"定义.
无法从调试shell调试静态函数,例如放置断点或执行它.另一方面,将所有函数定义为public会导致代码结构和优化悲伤.
我知道有一些选项,比如编译至少两个不同的版本,一个是静态的,一个是没有,但是这很适合自动化测试,而不是最终的生产版本.
我们会从您这里获得一些见解,主要是关于您如何解决(如果有的话)这种困境.或者将问题改为:" 什么更重要? "
这里对C中"静态"的讨论很好.
我反复阅读过头文件应该包含其他文件使用源代码所需的所有声明.假设您有一个不被其他源文件直接使用的函数(换句话说,非接口函数).它的原型应该放在.c文件的顶部,因为它不会被其他文件使用吗?或者它应该放在带有所有其他函数的头文件中,以便在一个地方完全汇总.c文件中的函数?
我知道静态函数的名称只在声明它的文件(翻译单元)中可见.这使得封装成为可能.
但是静态函数通常在源文件中声明,因为如果你在头文件中执行它,你最终会得到它的多个实现(我认为这不是我的意图static).
例:
main.c中
#include "functions.h"
int main()
{
FunctionA();
FunctionB(); // Can't call regardless of "static".
return 0;
}
Run Code Online (Sandbox Code Playgroud)
functions.h
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
void FunctionA();
#endif /* FUNCTIONS_H */
Run Code Online (Sandbox Code Playgroud)
functions.c
#include "functions.h"
#include <stdio.h>
static void FunctionB(); // Same whether "static" is used or not.
void FunctionA()
{
printf("A");
}
void FunctionB()
{
printf("B");
}
Run Code Online (Sandbox Code Playgroud)
那么什么时候static有用?