每当我足够深入地看待反射器时,我就会碰到没有来源的extern方法.我在 http://sdn上阅读了MSDN文档. microsoft.com/en-us/library/e59b22c5(v=vs.80).aspx .我从那篇文章中得到的是,必须注入使用extern修饰符的方法.我将其解释为意味着它类似于抽象的工厂模式.我还注意到我从未见过一种非静态外部方法.静态声明是一项要求(我可以看到这是有意义的)吗?我仍然在这里猜测,我不确定它是如何工作的.在我看来,编译器必须识别一些减轻处理的属性,但是我不知道这些属性是什么属性,除了我从MSDN示例中遇到的属性之外的属性.有人如何利用extern属性?它说,在许多情况下,这可以提高性能.另外,我将如何研究extern Object.InternalGetEquals()之类的方法? 解决方案 考虑读取C#规范的第10.6.7节,它回答了您的许多问题.为了您的方便,我在这里重现了其中的一部分: 当方法声明包括一个 外部修饰符,说
以下是关于 extern 的编程技术问答
如果您使用的是将整数值作为参数的C ++中的模板,并且在用作参数的整数变量上是否有任何要求与该变量用作函数调用中的参数时不同的要求? 这是问题的后续在这里.我特别想解决是否存在差异变量为函数或模板的" extern const int"? 我可以看到,对于某些模板案例,参数值将在编译时需要.这永远是真的吗?是否有一种方法可以指定参数值的某些用途,即在运行时使用该值? 解决方案 以下来自标准. 14.3.2.1: 非类型的非类型模板模板参数的模板 - 应为: 之一 积分或枚举类型的积分常数表达;或 非型模板参数的名称;或 对象或功能具有外部链接的地址,包括函数模板和函数模板ID,但不包括非静态类成员,表示为&id-expression,如果名称涉及函数或数组,则&是可选的,或者如果相应的模板参数为参考;或 按照5.3.1中描述的成员表示的指针. 5.19.1: 在几个地方,C ++需要评估积分或枚举常数的表达式:作为阵列边界(8.3.4
看来,Visual Studio 2010中的OpenMP实现具有严重的错误,不允许将外部变量作为线程驱动器.以下代码不会编译: file.c #include /* Declaration of external variable. */ extern int My_Var; #pragma omp threadprivate (My_Var) void MyFunc(void) { My_Var = 1;} 错误消息是: error C3053: 'My_Var' : 'threadprivate' is only valid for global or static data tems. 显然,编译器对变量的链接属性感到困惑. 最常见的是在多个文件中引用全局变量.因此,此问题使threadprivate在任何现实程序中都无法使用. 我想知道是否有技巧可以处理此错误.不幸的是,在我的情况下,这个问题阻止了我完全使用OMP
我在someclass.h中有一个不变的班级定义: extern NSString *const SCImportantString; @interface SomeClass @end 并在SomeClass.M中分配它: NSString *const SCImportantString = @"All your base are belong to us."; @implementation SomeClass @end 有没有一种方法可以通过带有名称的字符串访问此外部常数?我知道使用valueForKey:方法的类和即时变量是可能的. 在使用不同的构建配置时执行此操作将非常有用. 解决方案 如果您说的话没有内置的方式来从字符串中获取const指针值...因此,没有nsconstantfromname(@@xy) 你可以自己 NSString *const SCConstantByName(NSString *name) {
嗨,我有这个标头文件: #import @interface PCConstants : NSObject extern NSString *const kPCUserProfileKey; extern NSString *const kPCUserProfileNameKey; extern NSString *const kPCUserProfileFirstNameKey; extern NSString *const kPCUserProfileLocationKey; extern NSString *const kPCUserProfileGenderKey; extern NSString *const kPCUserProfileBirthDayKey; extern NSString *const kPCUserProfileInterestedInKey; @end 实施: #import "PC
这是一个新手C/Objective-C问题: - ) 说我想要一个cgretone和一个cggrecttwo常数. 我该如何声明? 谢谢 Jérémy 解决方案 其他答案很好 - 在某些情况下 - . a)声明它static将每次翻译发射副本.如果完全可以看到一次翻译(即,其定义在您的 .m/ .c文件中),那是可以的.否则,您最终会在每个翻译中获得副本,其中包括/导入具有静态定义的标头.这可能会导致二进制膨胀,并增加您的构建时间. b)const CGRect CGRectOne = {...};将在声明的范围中发出符号.如果碰巧是多个翻译可见的标头包括定义常数的标题). 现在,您知道了使用这两个声明的上下文,请涵盖extern方式. extern的方法允许您: 声明标题中的常数 在许多翻译中使用常数 恰好发出常数的一个定义 extern方法是重复多个文件之间常数的理想选择.这是一个例子: file.h // th
我正在尝试创建一些可以从iPhone应用程序中从Objective-C和C ++代码调用的实用程序功能.我有第三方C ++类,这些类无法编译为Objectivec ++(.mm).我有一个标题文件声明我的函数,然后是定义它们的.c文件.我已经检查了三倍的拼写错误,但是由于某种原因,我的链接器无法找到任何功能的定义. 这是C助手功能的标题: #ifndef FILE_LOADER_H #define FILE_LOADER_H #if __cplusplus extern "C" { #endif void * loadDataFromFile(const char * szFilename, bool bDocument); void * loadImageFromFile(const char * szFilename, bool bDocument); void loadMeshFromFile(const char *szFilename, void* pMesh)
使用LLVM编译器在Objetive-C中是什么? 另外,我注意到有CG_EXTERN和CG_INLINE宏.我们应该使用这些吗? (我找不到带有清晰解释的来源,所以我认为在这里创建一个来源,或者如果有人知道一个) ,则指向它) 解决方案 使用LLVM编译器在Objetive-C中静态,外部和内联(及其组合)是什么? 与C中的相同,除非您以OBJC ++的形式编译 - 那么它们的含义与C ++中的含义相同. 所以这是C的简介,但是如果您准备使用这些链接,请阅读链接,因为细节很重要: extern 摘要:表示标识符是在其他地方定义的. 详细信息:外部 静态 摘要(value):保存可变值以在其范围结束后生存. 摘要(函数):有效发射未命名的副本 - 对C中的私人功能有用,可用于与内联函数一起使用时逃脱多个定义错误. 详细信息: http://tigcc.tilitchc.org/doc/doc/doc/keywords
我正在尝试使用外部变量. 它抱怨说,由于使用了numberWithint,我没有将变量的值传递给我的变量 的值 所以我删除了const,并且抱怨外部变量必须是一个常数,所以这里的解决方案是什么? 我不想使用int .h extern NSNumber const *MoveID; .m NSNumber const *MoveID = [NSNumber numberWithInt:1]; 解决方案 您可以尝试执行以下操作: .h extern NSNumber *MoveID; .m NSNumber *MoveID; @implementation MYGreatClass + (void) initialize { static bool done = FALSE; if(!done){ // This method will be called again if you subclass the class an
我猜我只有在项目中有可能使用变量的C ++代码的机会. 如果是这种情况,使用Uikit_extern声明所有外部可用常数是安全的吗? 我怎么看不到更多? 解决方案 我猜我只有在项目中有可能使用变量的C ++代码的机会. 对.这是主要原因.发生这种情况是因为C和C ++符号使用不同的命名约定. 有一个不常见的原因:UIKIT_EXTERN也指定默认可见性. 注意:更普遍地,"符号" - 不是"变量",因为extern也可以应用于常数,函数等. 如果是这种情况,使用Uikit_extern声明所有外部可用常数是安全的吗? 简短答案:使用此表格将是一个好习惯(请阅读:'safe'),但通常最好的图书馆声明自己的等同于UIKIT_EXTERN. UIKIT_EXTERN是Uikit声明. 库不应取决于此声明,而只是定义自己的同义词 - 许多人都这样做,但是我发现它在C和C ++中更为常见,因为这些程序通常针对更多的平台,并且很大一部分iOS
我想拥有一个可以通过导入标头文件来访问任何地方的变量,但是我也希望它是静态的,因为只有其中一个创建.在我的.m文件中,我指定 static BOOL LogStuff = NO; 和初始化方法我设置了记录值: + (void)initialize { LogStuff = ... //whatever } 但是,我希望能够通过导入.h文件来访问我的变量,以便我想做类似的事情: static extern BOOL LogStuff; ,但我不允许这样做.有可能做我想做的事情吗?谢谢 在静态类数据成员和静态类方法的背景下,Objective-C中的 解决方案 static在C ++类中意味着与static不同的事情.在C和Objective-C中,A static变量或在全局范围处的函数意味着该符号具有内部链接. 内部链接意味着该符号是当前翻译单元的本地链接,这是当前源文件(.c或.m)和已递归的所有标题文件包括.该符号不能从其他翻译单元中
我一直在标题文件中使用静态常量: static NSString * const myString = @"foo"; ,但已经读到这不是这样做的"安全"或正确的方法.显然,如果我希望从另一个类访问我的constrings,我应该在.h中宣布字符串为: extern NSString * const myString; 然后在我的.m文件中: NSString * const myString = @"foo"; 这是正确的吗?如果是这样,不直接在我的.h文件中将其声明为静态的原因是什么?它的工作原理很好,我看不到周围的任何"安全"问题.它是一个const,因此无法从外部进行更改,我有意在班级之外访问它.我唯一能想到的是隐藏字符串的值? 解决方案 您的第一个变体 static NSString * const myString = @"foo"; // In .h file, included by multiple .m files 在每
extern关键字是什么意思?我已经看到,在函数声明之前,例如 extern void DoFoo ... 解决方案 extern给出一个名称外部链接.这意味着从程序中的其他翻译单元可以通过此名称访问对象或函数.对于函数,这是任何情况下的默认链接,因此(在此上下文中)的用法通常是多余的. 其他解决方案 外部关键字声明一个变量或函数,并指定其具有外部链接(从定义的文件以外的文件中可以看到其名称).修改变量时,Extern指定该变量具有静态持续时间(在程序结束时将其启动并进行交易时,将其分配).可以在另一个源文件中或以后在同一文件中定义变量或函数.默认情况下,文件范围的变量和功能声明是外部的. 您可以找到其他解决方案 对于初学者, 最初,我感到困惑地了解到这一点," 外部关键字声明了变量或函数,并指定了它具有外部链接 " 现在,我明白,我们将能够通过Extern关键字与其他类共享我们的变量. 例如: 通知.h #import
我想问使用FOUNDATION_EXPORT而不是extern 目标C 项目的原因是什么. 我已经检查了这个问题以及使用FOUNDATION_EXPORT赢得了340点(第一名),而使用extern仅74分(第二名). 有人可以解释为什么吗?是否有使用FOUNDATION_EXPORT而不是extern? 的实际原因 谢谢! 解决方案 如果您在nsobjcruntime.h(在基础上)中查看,您会在C ++中看到FOUNDATION_EXPORT在C,extern "C"中汇编为extern,以及Win32中的其他内容.因此,它在语言和操作系统之间更兼容.对于许多项目,这不会有任何区别.
当我在方法或变量声明之前使用单词extern时,我是否将其整体化,因此可以在整个项目中可读/可读/可用? 如果我在关键字之前使用Extern,那么我的项目的一部分仍然无法访问它吗?例如,仅通过子类别..例如我使用"受保护"的时候. extern是C关键字,对吗? Objective-C有等效吗?我实际上不明白为什么他们在Objective-C项目中使用C关键字. 谢谢 解决方案 1)您正在指定其链接.外部链接允许您或任何客户端引用符号. 涉及全局变量:如果变量可变和/或需要适当的构造,则应考虑此对象的方法或功能.值得注意的例外是NSString常数: // MONClass.h extern NSString* const MONClassDidCompleteRenderNotification; // MONClass.m NSString* const MONClassDidCompleteRenderNotification = @"MONC
我在Objective-C程序中的枚举可见性方面遇到了麻烦.我有两个标题文件,一个定义了typedef enum.另一个文件需要使用typedef'd类型. 在直接C中,我只需#include另一个标题文件,但是在Objective-C中,建议不要在标题文件之间使用#import,而不是根据需要使用forward @class声明.但是,我不知道如何转发枚举类型. 我不需要实际的枚举值,除了在相应的.m实现文件中,我可以安全地#import离开.那么,如何在标题中获得typedef enum的认可呢? 解决方案 最近的方式(Swift 3; 2017年5月3日)在Objective-C中转发枚举(NS_ENUM/NS_OPTION)是使用以下内容: // Forward declaration for XYZCharacterType in other header say XYZCharacter.h typedef NS_ENUM(NSUInteger, X
我读到extern关键字是函数上下文中隐含的,因此,除非您使用static>关键字另有说明(我没记错的话,这基本上是与static使用的变量 - 它们只能共享一个关键字),所有对象文件都可以看到它们.这是有道理的;使声明是隐式外部的,虽然当声明与定义同一文件中时在技术上不必要,但很有用,因为程序员不必每次都想从其定义文件中使用函数时键入extern,这种情况通常如此.对我来说似乎很奇怪的是,这是对声明和定义. 的隐含 有一个变量,我不需要为定义包括一个extern,实际上,尽管我可以这样做,但我的编译器给了我警告. 例如,我可以拥有mylib.h: int var = 5; //it isn't necessary to write this as //extern int var = 5; //my compiler even warns against it 和test.c #include "mylib.h" extern int var; 我通常
这很难在文本中解释,所以我将举一个例子. //f1.c int a = 5; int main() { printf("func2() output is: %i\n", func2() ); return 0; } //f2.c static int a = 3 int func2() { extern int a; return a; } 当我编译并运行此功能时,我会得到3,而我期待5.有人可以向我解释为什么我得到3个?我以为通过在功能中使用外部,它不会使用静态变量的值. 解决方案 来自N1256§6.2.2¶4: 对于使用存储类规范符声明的标识符,在范围内可见该标识符的先前声明,如果先前的声明指定了内部或外部链接,则在后面的声明为标识符的链接是与先前声明中指定的链接相同.如果没有可见事先声明,或者先前的声明没有指定链接,则标识符具有外部链接. so,extern在函数范围内表示该变量具有默认值的外部链接,,但是如
我知道,如果char数组是全局或静态局部性,其元素将初始化为\ 0,但是如果char数组是外部变量,该怎么办? 解决方案 如果该变量被声明为外部,但是nonglobal,则它也会收到相同的初始化处理.例如 namespace A { extern int x; int x;} 此非旧变量将初始化为零.所有名称空间范围变量都会收到此处理. 其他解决方案 外部变量只是声明.该变量在定义的模块中初始化.由于在该模块中,变量是一个全局,因此将其零定为零. 其他解决方案 extern只是 声明 . 是否将初始化该变量取决于 定义 . 另外,变量的值将取决于初始化的类型. C ++标准定义了3种初始化类型: 零启动 默认initialize Value-Initialize C ++ 03标准8.5/5恰当地定义每个. 良好阅读: 定义与一个定义之间有什么区别声明?