Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;来自header的静态函数的奇怪行为_C++_Function_Header_Scope - Fatal编程技术网

C++ c++;来自header的静态函数的奇怪行为

C++ c++;来自header的静态函数的奇怪行为,c++,function,header,scope,C++,Function,Header,Scope,我对头文件中声明的静态函数有这个问题。 假设我有这个文件“test.cpp”: 我不确定这个问题是否与头中声明为静态全局的函数的作用域有关,但我觉得奇怪的是,它在一种情况下会出现问题,而在另一种情况下不会出现问题:当我在包含声明头的头(funcs.hpp)中的静态函数中使用它时,会导致错误“未在此范围内声明”;而从包含头文件“funcs.hpp”的文件中使用时,它是正常的。 哪里出错了?静态说明符指定符号(变量或函数)仅在此翻译单元中可见。我认为这不是您想要的情况,因此请删除静态说明符。 注意编

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

我不确定这个问题是否与头中声明为静态全局的函数的作用域有关,但我觉得奇怪的是,它在一种情况下会出现问题,而在另一种情况下不会出现问题:当我在包含声明头的头(funcs.hpp)中的静态函数中使用它时,会导致错误“未在此范围内声明”;而从包含头文件“funcs.hpp”的文件中使用时,它是正常的。
哪里出错了?

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


还要注意。

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


另请注意。

对于函数,它不是不推荐的,并且在C++11 AFAIK中该状态已被撤销。编译器不关心链接,这是链接器的问题。我想说的是:该错误具有误导性,或者与链接无关。还请注意,内部链接避免了名称冲突,这对全局函数有好处ns(如果它们足够小,不需要单独编译)。嗯……删除static关键字不会对问题有多大改变。编译器看不到我在“my_allocator.hpp”中声明的所有内容。即使我创建了一个
新的
对象(如
OtherClass*cl=new OtherClass()
)从该头文件中定义的类中,我得到了相同的错误响应。对于函数,它不是不推荐的,并且该状态在C++11 AFAIK中已被撤销。编译器不关心链接,这是链接器的问题。我想说的是:该错误要么误导,要么与链接无关。还要注意,内部链接避免了name冲突,这有利于全局函数(如果它们足够小,不需要单独编译)。嗯……删除static关键字不会改变问题。编译器看不到我在“my_allocator.hpp”中声明的所有内容。即使我创建了一个
新的
对象(如
OtherClass*cl=new OtherClass()
)从该标头中定义的类中,我得到了相同的错误响应。“
my_malloc
未在此范围中声明不是链接器错误,而是名称查找错误。即,您的编译器找不到名称
my_malloc
。如果可能,请提供一个。实际上,编译器确实找到了名称:当我在“funcs.hpp”标题中使用
my_malloc
时,它会将名称报告为错误;在“test.cpp”中使用时没有错误。在我看来,“funcs.hhp”文件中以某种方式跳过了包含的头文件(“my_allocator.hpp”),但在包含“funcs.hpp”的“test.cpp”中正确使用了该头文件。我真的不明白为什么“
my_malloc
未在此范围内声明”不是链接器错误,而是名称查找错误。例如,您的编译器找不到名称
my_malloc
。如果可能,请提供一个。实际上,编译器确实找到了名称:当我在“funcs.hpp”标题中使用
my_malloc
时,它会将名称报告为错误;在“test.cpp”中使用时没有错误。在我看来,在“funcs.hhp”文件中以某种方式跳过了包含的头文件(“my_allocator.hpp”),但在包含“funcs.hpp”的“test.cpp”中正确使用了它。我真的不明白为什么
#include <cstdlib>
#include "funcs.hpp"

...do some operations...

void *ptr = my_malloc(size);

...do some operations...
#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
}
static void * my_malloc(size_t size) {
    return MYAllocator::instance()->malloc(size);
}