全局结构C

Global struct c++

本文关键字:结构 全局      更新时间:2023-10-16

我知道这个问题以前曾多次问过,但是我无法正常工作。对于特殊情况,我需要拥有一个将填写在一个文件中并阅读另一个文件的全局结构。

以下代码给我一个链接错误:

Undefined symbols for architecture x86_64:
  "_camera_data", referenced from:
      MyCameraData::return_sensor_shift() in extra-424af5.o
ld: symbol(s) not found for architecture x86_64
clang-5.0: error: linker command failed with exit code 1 (use -v to see invocation)

common.h:

#ifndef COMMON_H
#define COMMON_H
struct MyCameraData
{
    float sensor_shift;
    float return_sensor_shift();
};
extern MyCameraData camera_data;
#endif

main.cpp:

#include "common.h"
#include <iostream>
int main(){
    MyCameraData camera_data;
    camera_data.sensor_shift = 5.0;
    std::cout << camera_data.return_sensor_shift() << std::endl;
}

extra.cpp:

#include "common.h"
float MyCameraData::return_sensor_shift(){
    return camera_data.sensor_shift;
}

一定有我忽略的东西。有什么想法吗?

您可以移动

MyCameraData camera_data;

main到main.cpp中的全局范围,以解决链接器错误。但是,我建议创建一个common.cpp并定义该文件中的变量。比在main.cpp中定义它更干净。

common.cpp:

#include "common.h"
MyCameraData camera_data;

main.cpp:

#include "common.h"
#include <iostream>
int main()
{
    camera_data.sensor_shift = 5.0;
    std::cout << camera_data.return_sensor_shift() << std::endl;
}

此部分还可以:

common.h

#ifndef COMMON_H
#define COMMON_H
struct MyCameraData
{
    float sensor_shift;
    float return_sensor_shift();
};
extern MyCameraData camera_data;
#endif

由于您在标题文件中将camera_data声明为extern,这只是您缺少其定义的声明。

修复此文件:

common.cpp

#include "Common.h"
MyCameraData camera_data;

这应该解决您的问题。