我遇到的问题是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*)'
所有文件都位于同一文件夹中,属性中的源文件夹是什么
答案 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
关键字,它并不代表您的想法(无论如何都在文件/命名空间范围内)。