【问题标题】:c++ weird behaviour of static functions from headerc++ 头文件中静态函数的奇怪行为
【发布时间】:2013-09-12 16:05:20
【问题描述】:

我在头文件中声明的静态函数有这个问题。 假设我有这个文件“test.cpp”:

#include <cstdlib>
#include "funcs.hpp"

...do some operations...

void *ptr = my_malloc(size);

...do some operations...

“funcs.hpp”文件包含:

#include <ctime>
#include "../my_allocator.hpp" // my_malloc is defined here as a 
                               // global static function

...some functions...

static int do_operation() {
    // variables declaration
    void *p = my_malloc(size);

   // ...other operations
}

当我编译我的程序时,我收到一个错误'my_malloc' was not declared in this scope,它与“funcs.hpp”文件中使用的错误有关,但它与“test.cpp”中使用的错误无关。

有问题的函数在头文件“my_allocator.hpp”中定义为全局静态函数,它所做的只是获取分配器对象的实例并使用 malloc 函数:

static void * my_malloc(size_t size) {
    return MYAllocator::instance()->malloc(size);
}

我不确定这个问题是否与在标头内声明为静态全局的函数的范围有关,但对我来说看起来很奇怪的是它在一种情况下抱怨而不是在另一种情况下抱怨:当我使用它时在包含声明它的标头的标头(funcs.hpp)中的静态函数中,会导致错误“未在此范围内声明”;虽然从包含标题“funcs.hpp”的文件中使用它是可以的。 我哪里错了?

【问题讨论】:

  • my_malloc 未在此范围内声明”不是链接器错误,而是名称查找错误。 IE。您的编译器找不到名称my_malloc。如果可能,请提供SSCCE
  • 实际上,编译器确实找到了名称:当我在“funcs.hpp”标头中使用my_malloc 时,它会将名称报告为错误;在“test.cpp”中使用时没有错误。在我看来,包含的标头(“my_allocator.hpp”)以某种方式在“funcs.hhp”文件中被跳过,但在包含“funcs.hpp”的“test.cpp”中正确使用。我真的不明白为什么

标签: c++ function header scope


【解决方案1】:

static 说明符指定符号(变量或函数)仅在此翻译单元中可见。我认为这不是您想要的情况,因此请删除 static 说明符。
请注意编译器所说的:“my_malloc 未在此范围内声明”。这正是您使用static 指定的内容:Internal linkage

还要注意this use of the static keyword was deprecated in favor of unnamed namespaces

【讨论】:

  • 它不被函数弃用,并且该状态在 C++11 AFAIK 中被撤销
  • 编译器不关心链接,那是链接器的问题。我想说的是:该错误要么具有误导性,要么与链接无关。另请注意,内部链接避免了名称冲突,这对全局函数很有用(如果它们足够小而不需要单独编译)。
  • 嗯...删除静态关键字并没有太大改变问题。编译器看不到我在“my_allocator.hpp”中声明的所有内容。即使我从该标头中定义的类创建new 对象(如OtherClass *cl = new OtherClass()),我也会得到相同的错误响应。
猜你喜欢
  • 2021-09-24
  • 2023-03-18
  • 2015-01-12
  • 1970-01-01
  • 2011-12-31
  • 2017-06-22
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多