我知道C中的全局变量有时会有extern关键字.什么是extern变量?宣言是什么样的?它的范围是什么?
这与跨源文件共享变量有关,但这是如何工作的?我在哪里用extern?
C++的一个特性是能够创建未命名(匿名)命名空间,如下所示:
namespace {
int cannotAccessOutsideThisFile() { ... }
} // namespace
Run Code Online (Sandbox Code Playgroud)
您会认为这样的功能是无用的 - 因为您无法指定命名空间的名称,所以无法从外部访问其中的任何内容.但是这些未命名的命名空间可以在它们创建的文件中访问,就好像你有一个隐含的using子句.
我的问题是,为什么或何时使用静态函数会更好?或者他们基本上是两种做同样事情的方式?
尝试使用当前签名在g ++中编译我的代码时出错:
cannot declare member function static void Foo::Bar(std::ostream&, const Foo::Node*) to have static linkage
Run Code Online (Sandbox Code Playgroud)
我的问题是双重的:
在使用C++时,签名一直是我的死
编辑:这是类头文件,以及:
class Foo {
public:
Foo();
~Foo();
bool insert(const Foo2 &v);
Foo * find(const Foo2 &v);
const Foo * find(const Foo2 &v) const;
void output(ostream &s) const;
private:
//Foo(const Foo &v);
//Foo& operator =(const Foo &v);
//Not implemented; unneeded
struct Node {
Foo2 info;
Node *left;
Node *right;
};
Node * root;
static bool insert(const Foo2 &v, Node *&p);
static void …Run Code Online (Sandbox Code Playgroud) 未命名的命名空间如何优于static关键字?
C++标准中的$ 7.3.1.1/2节描述如下:
在声明命名空间作用域中的对象时,不推荐使用static关键字; unnamed-namespace提供了一个更好的选择.
我不明白为什么一个未命名的命名空间被认为是一个更好的选择?理由是什么?我已经知道标准的内容很长一段时间,但我从未认真考虑过,即使我回答这个问题:未命名的命名空间优于静态?
它是否被认为是优越的,因为它也可以应用于用户定义的类型,正如我在回答中所描述的那样?还是有其他原因,我不知道?我问这个问题,特别是因为这是我在答案中的推理,而标准可能会考虑其他因素.
在C++中,可以static在翻译单元中使用关键字来影响符号的可见性(变量或函数声明).
在n3092,这被弃用了:
附件D.2 [depr.static]
在命名空间范围内声明对象时,不推荐使用static关键字(见3.3.6).
在n3225中,这已被删除.
它确实强调,为了与C兼容(以及将C程序编译为C++的能力),弃用令人讨厌.但是,直接将C程序编译为C++本身就是一种令人沮丧的经历,所以我不确定它是否值得考虑.
有谁知道为什么它被改变了?
当使用nvcc(CUDA 5.0)编译下面的代码时,出现错误"内存限定符的非法组合",因为显然不可能在类中具有全局内核.
class A
{
public:
__global__ static void kernel();
};
__global__ void A::kernel()
{}
Run Code Online (Sandbox Code Playgroud)
在处理非静态成员时我可以理解这个限制,但是为什么在内核声明为静态时仍然会出现错误?调用此类成员与在函数体中声明函数时调用该函数没有什么不同(A在本例中).
A::kernel <<< 1, 1 >>> ();
Run Code Online (Sandbox Code Playgroud)
有没有理由我错过了为什么还没有实现呢?
编辑:根据答案和评论中的回答,我对我的问题不够清楚.我的问题不是出现错误的原因.显然,这是因为它尚未实施.我的问题是为什么它没有得到实施.到目前为止,我还没有想到让这个功能得以实现的原因.我意识到我可能已经忘记了一个会使问题复杂化的特殊情况,因此也就是问题.
我认为这是一个合理的功能的原因是:
this指针所以即使在主机上的对象上调用内核,访问其数据也没有冲突,因为这些数据首先是不可访问的(来自哪个对象的数据? ).A a; a.staticKernel<<<...,...>>>();)完全等同于在没有对象的情况下调用它(A::staticKernel<<<...,...>>>();),正如我们在常规C++中习惯的那样.我错过了什么?