Вот MCVE, который показывает мою проблему:
file.cpp
struct Elf64_Sym;
#include
Конечно, в полном коде предварительное объявление выполняется в файле .hpp, а включение выполняется в файле .cpp, но это небольшой пример воспроизводит ту же самую проблему. Вы можете попытаться скомпилировать его, используя следующую командную строку g++ file.cpp, и вы получите следующую ошибку:
In file included from /usr/include/libelf.h:36,
from file.cpp:3:
/usr/include/elf.h:538:3: error: conflicting declaration 'typedef struct Elf64_Sym Elf64_Sym'
538 | } Elf64_Sym;
| ^~~~~~~~~
file.cpp:1:8: note: previous declaration as 'struct Elf64_Sym'
1 | struct Elf64_Sym;
| ^~~~~~~~~
Эта компиляция подходит для gcc (например, в C), но не с g++ (например, в C++).
Есть ли у вас решение, которое позволило бы предварительное объявление структуры Elf64_Sym в C++?
И для полноты картины вот определение этой структуры в :
typedef struct
{
Elf64_Word st_name; /* Symbol name (string tbl index) */
unsigned char st_info; /* Symbol type and binding */
unsigned char st_other; /* Symbol visibility */
Elf64_Section st_shndx; /* Section index */
Elf64_Addr st_value; /* Symbol value */
Elf64_Xword st_size; /* Symbol size */
} Elf64_Sym;
Обновленный MCVE
Вот MCVE, который показывает мою проблему (и спасибо @user12002570 за указание на то, что мой предыдущий MCVE был неправильным) :file.hpp
#ifndef FILE_HPP
#define FILE_HPP
#include
struct Elf64_Sym;
uint64_t getSize(Elf64_Sym * ptr);
#endif
file.cpp
#include "file.hpp"
#include
uint64_t getSize(Elf64_Sym * ptr)
{
return ptr->st_size;
}
Вы можете попробовать скомпилировать его, используя следующую командную строку g++ -c file.cpp, и вы получите следующую ошибку:
/usr/include/elf.h:538:3: error: conflicting declaration 'typedef struct Elf64_Sym Elf64_Sym'
538 | } Elf64_Sym;
| ^~~~~~~~~
In file included from file.cpp:1:
file.hpp:6:8: note: previous declaration as 'struct Elf64_Sym'
6 | struct Elf64_Sym;
| ^~~~~~~~~
Есть ли у вас решение, которое позволило бы предварительное объявление структуры Elf64_Sym в C++?
И для полноты картины вот определение этой структуры в :
typedef struct
{
Elf64_Word st_name; /* Symbol name (string tbl index) */
unsigned char st_info; /* Symbol type and binding */
unsigned char st_other; /* Symbol visibility */
Elf64_Section st_shndx; /* Section index */
Elf64_Addr st_value; /* Symbol value */
Elf64_Xword st_size; /* Symbol size */
} Elf64_Sym;
Подробнее здесь: https://stackoverflow.com/questions/786 ... tion-error