我有几个关于 C++ 中的 static 关键字的问题(可能还有其他语言。)将函数声明为静态的目的是什么?
void static foo(int aNumber) {
... }
静态内联函数怎么样?
void static inline foo(int aNumber) {
... }
在函数中使用 static 关键字有什么好处吗?这些好处是否也适用于类函数? 我意识到某些数据类型(如结构和数组)在使用较旧的编译器进行编译时必须是静态的,但是在使用新的 ANSI-C++ 编译器(如 MS VC++ 2008)时有什么意义吗?我知道在循环内使用静态变量可以通过将数据保存在内存中而不是在每次循环迭代时重新分配内存来节省时间,但是当变量只声明一次时,比如在头文件顶部或命名空间内,情况如何?
最佳答案
取决于上下文:
与 C++ 中的许多事物一样,static 根据其上下文表示不同的事物。
在 C++ 中,同一个词根据其上下文表示不同的意思是很常见的。
例如:
* 用于乘法、解引用指针和创建指针。 & 用于获取变量的地址、声明引用以及作为按位与运算符。静态的全局使用:
如果您在类外部和全局范围内将函数或变量声明为静态,则它仅特定于该文件。如果您尝试在不同的文件中使用该变量或函数(通过前向声明),您将收到链接错误。
例子:
a.cpp:
static void fn()
{
cout<<"hello a!"<<endl;
}
b.cpp:
void fn();
void gn()
{
fn();//causes linking error
}
此功能允许您使用其他文件永远看不到的函数,这样您就不会导致多次定义的符号可能出现链接器错误。执行此操作的首选方法是使用匿名 namespace :
a.cpp:
namespace
{
void fn() // will be static to a.cpp
{
cout<<"hello a!"<<endl;
}
}
类内部使用静态:
如果在类(或结构)内将函数或变量声明为静态,则它是类函数或类变量。这意味着整个类(class)只有一个。类函数只能使用类变量。类变量在该类的所有实例之间共享。
class C
{
public:
static void fn()
{
y = 4;//<--- compiling error
// can't access member variable within a static function.
}
int y;
}
如果您有特定于您的对象类但不特定于实例的东西,这是一个很好的功能。
在函数内部使用静态:
如果您在函数内部将一个变量声明为静态变量,您可以认为该变量值将在调用时保持不变。它只会被初始化一次。
例子:
//Will print 0, then 1, then 2, ...
void persistentPrintX()
{
static int x = 0;
cout << x << endl;
x++;
}
我个人尽量避免这种情况,您可能应该这样做。拥有全局状态并不好。最好是具有给定相同输入保证相同输出的函数。
就像英语一样:
context sensitive meaning这个概念并不是C++特有的,你甚至可以在英语中看到它。
放映一部电影(意思是放映电影)屏幕坏了(指电视的一部分)其他编程语言中的其他含义:
根据编程语言的不同,可能会有不同的含义,但是当您说 static 时,大多数人首先想到的是类变量/函数与成员变量/函数。
关于c++ - 关于带有函数和数据的static关键字的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2237603/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
我需要一个通过输入字符串进行计算的方法,像这样function="(a/b)*100"a=25b=50function.something>>50有什么方法吗? 最佳答案 您可以使用instance_eval:function="(a/b)*100"a=25.0b=50instance_evalfunction#=>50.0请注意,使用eval本质上是不安全的,尤其是当您使用外部输入时,因为它可能包含注入(inject)的恶意代码。另请注意,a设置为25.0而不是25,因为如果它是整数a/b将导致0(整数)。
使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做