我知道C中的全局变量有时会有extern关键字.什么是extern变量?宣言是什么样的?它的范围是什么?
这与跨源文件共享变量有关,但这是如何工作的?我在哪里用extern?
我想问一下有什么用背后的原因FOUNDATION_EXPORT,而不是extern在目标C项目.
我已经检查了这个问题,使用FOUNDATION_EXPORT得到了高达340分(第一名),而extern只使用了74分(第二名).
谁有人解释原因?是否有任何实际的理由FOUNDATION_EXPORT代替使用extern?
谢谢!
TemplHeader.h
template<typename T>
void f();
Run Code Online (Sandbox Code Playgroud)
TemplCpp.cpp
template<typename T>
void f(){
//...
}
//explicit instantation
template void f<T>();
Run Code Online (Sandbox Code Playgroud)
Main.cpp的
#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
f<char>();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是正确的使用方法extern template,还是仅将此关键字用于类模板,如图2所示?
TemplHeader.h
template<typename T>
class foo {
T f();
};
Run Code Online (Sandbox Code Playgroud)
TemplCpp.cpp
template<typename T>
void foo<T>::f() {
//...
}
//explicit instantation
template class foo<int>;
Run Code Online (Sandbox Code Playgroud)
Main.cpp的
#include "TemplHeader.h"
extern template class foo<int>();
int main() {
foo<int> test;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道将所有这些放在一个头文件中是好的,但如果我们在多个文件中实例化具有相同参数的模板,那么我们会得到多个相同的定义,编译器会将它们全部删除(除了一个)以避免错误.我该怎么用 …
我理解"内联"本身就是对编译器的建议,并且在它的结构中它可能会或可能不会内联函数,它也会产生可链接的目标代码.
我认为"静态内联"执行相同的操作(可能内联也可能不内联),但在内联时不会产生可链接的目标代码(因为没有其他模块可以链接到它).
"extern inline"在哪里适合图片?
假设我想用内联函数替换预处理器宏,并要求此函数被内联(例如,因为它使用__FILE__和__LINE__宏,这些宏应该为调用者而不是这个调用函数解析).也就是说,如果函数没有内联,我想看到编译器或链接器错误."extern inline"这样做吗?(我假设,如果没有,除了坚持使用宏之外,没有办法实现这种行为.)
C++和C之间是否存在差异?
不同编译器供应商和版本之间是否存在差异?
我在Objective-C程序中遇到enum可见性问题.我有两个头文件,一个定义了一个typedef enum.另一个文件需要使用typedef'd类型.
在直接C中,我只是#include其他头文件,但在Objective-C中,建议不要#import在头文件之间使用,而是@class根据需要使用前向声明.但是,我无法弄清楚如何转发声明枚举类型.
我不需要实际的枚举值,除了相应的.m实现文件,我可以安全地#import离开.那么如何才能typedef enum在标题中识别?
每当我深入了解反射器时,我就会碰到extern没有光源的方法.我在http://msdn.microsoft.com/en-us/library/e59b22c5(v=vs.80).aspx上阅读了msdn文档.我从那篇文章得到的是extern必须注入带有修饰符的方法.我将其解释为意味着它的工作方式类似于抽象工厂模式.我也注意到我从未见过非静态的外部方法.静态声明是一个要求(我可以看到这有什么意义)?我还在猜这里,我不确定它是如何运作的.在我看来,编译器必须识别某些缓解处理的属性,但我不知道除了我MethodImplAttribute和DllImportAttributeMSDN示例中遇到的属性之外的属性.有人如何利用该extern属性?它说,在许多情况下,这可以提高性能.另外,我将如何extern研究类似的方法来源Object.InternalGetEquals()?
我可以将extern和const混合为extern const吗?如果是,const限定符是否仅在其声明的范围内强加它的统治,或者它是否应与它声明的转换单元的声明完全匹配?即extern const int i;即使实际的i不是const,反之亦然,我可以声明说吗?
考虑以下程序:
extern int x;
auto x = 42;
int main() { }
Run Code Online (Sandbox Code Playgroud)
Clang 3.5接受它(现场演示),GCC 4.9和VS2013不接受(前者的现场演示).谁是对的,C++标准中指定的正确行为在哪里?
为什么extern int n在声明n时(在不同的文件中)不编译static int n,但在声明时有效int n?(这两个声明都在文件范围内.)
基本上,为什么int n文件范围与同一范围不static int n一样?它只与extern有关吗?如果是这样,我错过了什么?