一个达不溜 發表於 2023-11-9 11:02:53

iOS关键字static extern const使用示例详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>全局变量</li><ul class="second_class_ul"><li>extern</li><li>static - 静态全局变量</li></ul><li>全局变量和静态变量区别(摘抄)</li><ul class="second_class_ul"><li>const</li></ul><li>局部变量</li><ul class="second_class_ul"><li>static - 静态局部变量</li></ul></ul></div><p class="maodian"></p><h2>全局变量</h2>
<p>在函数外声明的变量,可以在声明时附上初始值,存储在全局区,生命周期为整个程序运行期间。</p>
<div class="jb51code"><pre class="brush:cpp;">#import "SEObject.h"
//定义在.h文件中时该类被其他文件引入时报重复定义的错误(1 duplicate symbol for architecture x86_64)
NSString * SEString = @"SEString";
@implementation SEObject
@end</pre></div>
<div class="jb51code"><pre class="brush:cpp;">#import "SEView.h"
//#import "SEObject.h"
//NSString * SEString;
@implementation SEView
@end</pre></div>
<p>源程序中不能存在相同的对象名,否则编译器报错(<code>1 duplicate symbol for architecture x86_64</code>)</p>
<p class="maodian"></p><h3>extern</h3>
<p>此时如果其它源文件想要访问该全局变量,需要声明<code>extern</code>。</p>
<ul><li>在使用的类中<code>extern 全局变量</code>,此时不要要引入全局变量所在类。</li></ul>
<div class="jb51code"><pre class="brush:cpp;">#import "SEView.h"
//#import "SEObject.h"
//NSString * SEString;
@implementation SEView
- (void)add {
    extern NSString * SEString;
    NSLog(@"%@",SEString);
    SEString = @"SEString2";
    NSLog(@"%@",SEString);
}
@end</pre></div>
<ul><li>在全局变量所在类的<code>.h文件</code>中声明该全局变量外部使用(<strong>推荐</strong>)。</li></ul>
<div class="jb51code"><pre class="brush:cpp;">#import &lt;Foundation/Foundation.h&gt;
NS_ASSUME_NONNULL_BEGIN
extern NSString * SEString;
@interface SEObject : NSObject
@end
NS_ASSUME_NONNULL_END</pre></div>
<div class="jb51code"><pre class="brush:cpp;">#import "SEView.h"
#import "SEObject.h"
//NSString * SEString;
@implementation SEView
- (void)add {
    //extern NSString * SEString;
    NSLog(@"%@",SEString);
    SEString = @"SEString2";
    NSLog(@"%@",SEString);
}
@end
SEString
SEString2</pre></div>
<p class="maodian"></p><h3>static - 静态全局变量</h3>
<p>用static修饰的全局变量为静态全局变量,存储在全局区,生命周期为整个程序运行期间。</p>
<div class="jb51code"><pre class="brush:cpp;">#import "SEObject.h"
//定义在.h文件中时该类被其他文件引入时报重复定义的错误(1 duplicate symbol for architecture x86_64)
static NSString * SEString = @"SEString";
@implementation SEObject
+ (void)add {
    NSLog(@"%@",SEString);
    SEString = @"SEString2";
    NSLog(@"%@",SEString);
}
SEString
SEString2
@end</pre></div>
<p><code>static</code>不能与<code>extern</code>组合使用,否则报错:<code>Cannot combine with previous &#39;extern&#39; declaration specifier</code></p>
<p><strong>声明在.h文件时,引入该类,依然可以使用并修改此静态全局变量;</strong></p>
<p><strong>声明在.m文件时,两个类文件可是使用相同变量名,彼此相互独立。</strong></p>
<p class="maodian"></p><h2>全局变量和静态变量区别(摘抄)</h2>
<p>两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。</p>
<p class="maodian"></p><h3>const</h3>
<p><code>const</code>修饰的变量是不可变的。</p>
<p>正确用法:</p>
<div class="jb51code"><pre class="brush:cpp;">static NSString * const SEString = @"SEString";
</pre></div>
<p>以下两种写法<code>const</code>修饰的是<code>* SEString</code>,<code>*</code>是指针指向符,也就是说此时<code>指向内存地址是不可变的</code>,而<code>内存保存的内容时可变的</code>。</p>
<div class="jb51code"><pre class="brush:cpp;">static NSString const * SEString = @"SEString";
static const NSString * SEString = @"SEString";
</pre></div>
<p class="maodian"></p><h2>局部变量</h2>
<p>函数内部声明的变量,仅在当前函数执行期间存在。</p>
<div class="jb51code"><pre class="brush:cpp;">@implementation SEObject

- (void)add {
    NSInteger a = 1;
    NSInteger b = 2;
    NSInteger c = a+b;
    NSLog(@"c = %ld",c);
}

@end
</pre></div>
<p class="maodian"></p><h3>static - 静态局部变量</h3>
<p>用static修饰的局部变量为静态局部变量,存储在全局区,生命周期为整个程序运行期间。</p>
<div class="jb51code"><pre class="brush:cpp;">- (void)add {
    NSInteger a = 1;
    NSInteger b = 2;
    static NSInteger c2;
    c2 += a+b;
    NSLog(@"c2 = %ld",c2);
}
调用两次结果:
c2 = 3
c2 = 6</pre></div>
<p>以上就是iOS关键字static extern const使用示例详解的详细内容,更多关于iOS关键字static extern const的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>iOS报Multiple commands produceMultiple错误的解决方案</li><li>iOS开发输入自动填充UITextField背景色</li><li>iOS小数取整的方法(ceil floor round)示例</li><li>iOS&nbsp;overFullScreen与fullScreen区别分析</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: iOS关键字static extern const使用示例详解