Rick York
Вот эксперимент, который вы можете попробовать. Вместо стандартного include file guard который выглядит следующим образом:
// HeaderFile.h
#ifndef HEADERFILE_H
#define HEADERFILE_H
// ... code goes here
#endif // HEADERFILE_H
измените его, чтобы сгенерировать ошибку, если она будет включена повторно, чтобы вы могли отследить проблему. Это будет выглядеть примерно так:
// HeaderFile.h - revised to generate an error on repeated inclusion
#ifndef HEADERFILE_H
#define HEADERFILE_H
#else
#error this file was repeatedly included
#endif
/***
#ifndef HEADERFILE_H // this is here so it can be easily copy and pasted
#include "HeaderFile.h" // and the file can be safely included when needed
#endif
***/
// ... code goes here
Это определение макроса вызовет ошибку, если вы включите его повторно, но вы можете использовать ifdef, который комментируется, и всегда делать это безопасно. Попробуйте это и посмотрите, указывает ли это на то, где ваша проблема.
Я делаю это во всех своих include-файлах, потому что это может значительно увеличить скорость компиляции в больших проектах. Я также делаю все заголовочные файлы автономными, то есть они включают в себя все, что им нужно для правильной компиляции, и эта привычка очень помогает.
Фу-у-у, я получил эту идею от Microsoft. Раньше они часто делали это в заголовках Win32 SDK, но теперь уже не так много, так как pragma один раз эффективно делает то же самое. Я предпочитаю получать ошибку, чтобы легче было отслеживать проблемы.