Используйте прагму include guard (или, если доступно, с вашим компилятором) один раз.
#ifndef PATH_TO_FILE_FILENAME_H
#define PATH_TO_FILE_FILENAME_H
struct TestStruct {
int a;
double d;
};
int k();
#endif
или (намного лучше, если доступно!)
#pragma once
struct TestStruct {
int a;
double d;
};
int k();
Также может быть целесообразно использовать пространства имен дляизбегайте загрязнения глобального пространства имен
#pragma once
namespace Test
{
struct TestStruct {
int a;
double d;
};
int k();
};
Обратите внимание, что во избежание использования muldefs вам также необходимо объявить k () inline, если вы решите предоставить его определение в заголовке (иногда это может быть неизбежным, если вам нужноиспользовать шаблоны и не указывать явные параметры шаблона).
#pragma once
namespace Test
{
struct TestStruct {
int a;
double d;
};
template<typename T>
inline int k<T>() // This now has to be inline or static.
{
// Some implementation
}
};
Редактировать: Кроме того, разница между объявлением и определением для структуры / класса мало чем отличается от функции:
void TestFunction(); // The compiler now knows there's a function called TestFunctionand can attempt to link the symbol information to its implementation somewhere in the compilation unit.
Там, где в этом случае мы не реализуем основные функции функции, просто говорим, что она существует, и поскольку компилятор знает сигнатуру (или то, что функция обещает взять и вернуть), она может продолжаться счастливо.В случае TestStructs предварительное объявление (без реализации) будет
class TestStruct;