加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 神秘链接器警告:两个模块中定义的公共符号

发布时间:2020-12-16 09:48:35 所属栏目:百科 来源:网络整理
导读:我有2个字符串数组,在头文件中定义如下: #ifndef DRC_DefinesH#define DRC_DefinesH#include string#include System.hpp//---------------------------------------------------------------------------std::string MagFields[] = { "SCAN","EVENT","EVENT
我有2个字符串数组,在头文件中定义如下:

#ifndef DRC_DefinesH
#define DRC_DefinesH
#include <string>
#include <System.hpp>
//---------------------------------------------------------------------------

std::string MagFields[] = {
   "SCAN","EVENT","EVENT2","EVENT1","EVENT3","VECTORX","VECTORY","VECTORZ","MAG1RAW","MAG2RAW","MAG3RAW","MAG4RAW","MAG1UNCOMP","MAG2UNCOMP","MAG3UNCOMP","MAG4UNCOMP","MAG1COMP","MAG2COMP","MAG3COMP","MAG4COMP","GRAD1","GRAD2","GRAD3","UTC","LAT","LON","ALT","ANALOG1","ANALOG2","ANALOG3","ANALOG4","SYSTIME"};

std::string AnalogFields[] = {
   "SCAN","EVENT0","ANALOG5","ANALOG6","ANALOG7","ANALOG8","ANALOG9","ANALOG10","ANALOG11","ANALOG12","ANALOG13","ANALOG14","ANALOG15","ANALOG16","ANALOG17","ANALOG18","ANALOG19","ANALOG20","ANALOG21","ANALOG22","ANALOG23","ANALOG24","ANALOG25","ANALOG26","ANALOG27","ANALOG28","ANALOG29","ANALOG30","ANALOG31","ANALOG32"};

... other stuff

    #endif

此标头包含许多其他内容,并间接包含在C Builder XE2项目的每个单元中.当我构建项目时,我得到很多链接器警告声明

“公共符号_MagFields和_AnalogFields在模块AAA和BBB中定义”

其中AAA和BBB是项目中每个单元的组合.

这些特殊声明可以移动到单元的实现端,警告消失,但我想了解为什么有必要. Embarcadero文档告诉我如何摆脱警告,而不是它意味着什么.

解决方法

您正在标题中定义数组,在包含标题的每个翻译单元中给出定义.但是你只允许一个单一的定义,因为定义是导致为数组分配内存的原因,它只能存在于一个地方.这被称为一个定义规则.

将定义移动到源文件中,因此它们不会重复.然后只需在头文件中声明数组:

extern std::string MagFields[];
extern std::string AnalogFields[];

如果您不需要修改它们,另一个选项是将它们声明为const以给它们内部链接,以便包含该定义的每个转换单元获得它自己的数组副本.这有一个缺点,你最终会在程序中使用多个阵列副本,浪费内存.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读