【问题标题】:GDB incomplete type forward enum : int declarationGDB 不完整类型前向枚举:int 声明
【发布时间】:2018-06-05 10:43:30
【问题描述】:

我在我的 cpp 程序中使用了一个前向枚举声明,这导致 gdb 给我一个不兼容的类型。这是一个最小的工作示例:

定义.h:

/*definitions.h*/
#ifndef DEFINITIONS_H_
#define DEFINITIONS_H_

enum ForwardEnum : int;
typedef ForwardEnum ForwardEnum;

typedef struct {
const ForwardEnum EnumValue;
} ElemConfig;

#endif //DEFINITIONS_H_

config.h:

/*config.h*/
#ifndef CONFIG_H_
#define CONFIG_H_

#include "definitions.h"

enum ForwardEnum : int {
    EnumValue1 = -1,
    EnumValue2,
};

#endif //CONFIG_H_

classA.h:

/*classA.h*/
#ifndef CLASSA_H_
#define CLASSA_H_

#include <array>
#include "definitions.h"
#define N_ELEMS 8

class A{
    private:
        const std::array<ElemConfig, N_ELEMS> Config;
    public:
        A(const std::array<ElemConfig, N_ELEMS>);
 };

#endif //CLASSA_H_

main.cpp:

/*main.cpp*/
#include <iostream>
#include <array>
#include "definitions.h"
#include "config.h"
#include "classA.h"

const std::array<ElemConfig, N_ELEMS> AConfig {{{EnumValue1}}};

A::A(const std::array<ElemConfig, N_ELEMS> Config) : Config(Config) 
{
    ForwardEnum a = Config[0].EnumValue;
    std::cout << a << std::endl;
};

int main(void)
{
    A objectA(AConfig);
}

当我尝试在 gdb 中调试 A 类构造函数时,我得到了一个不完整的枚举变量类型。根据这个question,我尝试将其转换为我认为兼容的类型:

print (ForwardEnum) a

当失败时,我尝试查看问题是否是 typedef:

print (const enum ForwardEnum) a

而且还要反汇编构造函数,但都失败了。

那么打印 EnumValue 内容的正确类型转换是什么?

(或者,我怎样才能让 gdb 解决不兼容的类型,同时保留前向声明?)

我正在使用 gdb 7.7.1 和 gcc 4.8.4

【问题讨论】:

  • typedef ForwardEnum ForwardEnum; 的意义何在?
  • @VTT 将系统配置(包括可能的枚举值)放在单独的文件中。然后配置结构需要存储枚举值
  • 但是typedef 有什么帮助呢? typedef for struct 似乎也没用。
  • 在我的实际应用中,我有时会使用 ForwardEnum 辅助变量,这样可以节省一些文字。
  • 如果类型别名的长度完全相同,如何节省一些写作?

标签: c++ gdb incomplete-type


【解决方案1】:

尝试使用print /d a/d 表示格式为整数。

请参阅 gdb 中的 help xhelp print

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    相关资源
    最近更新 更多