Обрабатывать неоднозначные объявления структуры при отладке кода C - PullRequest
0 голосов
/ 04 июня 2018

В настоящее время я отлаживаю код для определенного алгоритма проекции координат в osgeo / proj.4, чтобы сравнить его с другой реализацией, где я подозреваю наличие ошибки.

proj.4 содержит несколько различныхобъявления для определенной структуры с тем же именем, каждое из которых находится в отдельном .c-файле:

struct pj_opaque {
    double phic0;
    double cosc0, sinc0;
    double R2;
    void *en;
};

struct pj_opaque {
    double K, c, hlf_e, kR, cosp0, sinp0;
};

(и многие другие).Меня интересует правильное объявление структуры:

struct pj_opaque {
    double  A, B, E, AB, ArB, BrA, rB, singam, cosgam, sinrot, cosrot;
    double  v_pole_n, v_pole_s, u_0;
    int no_rot;
};

Кажется, это вызывает проблемы в отладчике.Во время выполнения я не могу просмотреть все значения интересующей меня структуры, потому что отладчик использует несовместимое объявление для типа, в котором нет элементов, на которые я хочу смотреть.

Вот пример: Q имеет тип pj_opaque *, я хочу посмотреть на член u_0.В часах структура Q даже не имеет члена u_0.Прямой доступ к нему через Q-> u_0 приводит к ошибке.(класс "XYZ" не имеет члена "UVW")

Visual Studio debugger/watch uses wrong struct declaration

Существует ли общий способ устранения такой неоднозначности во время отладки, напримерпереключатель компилятора, который делает эти неоднозначные имена уникальными?

Для справки: proj.4 построен с vcpkg в Windows, отладчик - Visual Studio 2017.

1 Ответ

0 голосов
/ 04 июня 2018

Я предполагаю, что проблема в том, что из вызывающей стороны объявление структуры непрозрачно, поэтому вы не сможете его увидеть, независимо от того, есть ли одно или несколько определений структуры в другом месте.Это означает, что вызывающая сторона просто имеет неполное объявление, например, typedef struct pj_opaque pj_opaque где-то.Это означает, что вызывающая сторона не может знать содержимое этой структуры, это способ сделать OO и частную инкапсуляцию в C.

Разумная вещь, которую нужно сделать, будет выглядеть примерно так:

// top of caller .c file
#ifdef DEBUG_RELEASE
struct pj_opaque { /* definition here */ };
#endif

Это позволяет компилятору файла .c вызывающего абонента узнать, что содержит структура, передать это в объектный файл, который, в свою очередь, может быть передан в формат файла отладчика.Это немного грязно, хотя, поскольку он предоставляет код вызывающей стороне, если только в режиме отладки.Более привлекательной альтернативой было бы создание файла заголовка, такого как «pj_opaque_debug.h», в который вы поместили вышеуказанный код переключения компилятора.

...