Eclipse CDT不了解方法定义是什么

时间:2018-02-14 17:08:18

标签: c++ eclipse-cdt linker-errors

我遇到的问题是Eclipse CDT以某种方式不理解在头文件中声明的方法的定义,如: 标题y_sort_network.hpp的示例:

    #pragma once
extern "C" {
#include <stdint.h>
}

namespace y_my{
static inline void ySortSingleUpto16(uint32_t * arr, uint32_t * to);
static inline void yMergex16(uint32_t * arr, uint32_t *to);

}

源y_sort_network.cpp的例子:

#include "y_sort_network.hpp"
namespace y_my{

static inline void yMergex16(uint32_t * arr, uint32_t *to) {
// body ...
}
static inline void ySortSingleUpto16(uint32_t * arr, uint32_t * to) {
// body ...
}

}

然后,这个mwthod将不会被发现主要方法,意味着它们被声明但没有链接:

 `sort_network_test.cpp:19:` undefined reference to `y_my::yMergex16(unsigned int*, unsigned int*)'

所有文件都位于同一文件夹中,属性中的源文件夹是什么

1 个答案:

答案 0 :(得分:0)

  

Eclipse CDT不知何故无法理解方法的定义

Eclipse是一个IDE,也就是说,一个带有妄想的文本编辑器。您获得的错误来自CDT插件为您运行的编译器。我只提到这个来解释为什么eclipse-cdt标签不相关,因为我是一个可怕的学生。

extern "C" {
#include <stdint.h>
}
最后一点迂腐,我保证:你应该使用

#include <cstdint>

如果你有一个模糊的最近符合标准的编译器。

现在,请考虑这两个非常相似的声明,其中static表示两个完全不同的东西:

struct S {
  static void func();
};
namespace N {
  static void func();
};

第一个声明了一个类型S,一个静态方法 S::func,它不在S的特定实例上运行。它没有说明符号S::func的链接。

在第二种情况下,N::func没有类成为静态成员(在这方面名称空间不像类,因为你不能拥有名称空间的实例 )。在此处,static描述了N::func的关联,并表示“未导出到其他翻译单元”。

现在考虑你的cpp文件:用静态链接定义你的两个函数。这意味着符号不会导出到其他翻译单元,例如测试程序,这意味着您的测试程序无法访问这些函数的任何定义。

tl; dr - 只需删除static关键字,它并不代表您的想法(无论如何都在文件/命名空间范围内)。