Visual Studio 2022:
Я включил простой заголовок для хранения основных функций, таких как печать текста или выполнение функций, в мой файл .cpp, но после включения предварительно скомпилированного заголовка, в котором хранится Windows.h, файл .cpp не распознает функции/переменные внутри непредварительно скомпилированного файла. заголовок.
Цена за конверсию:
#pragma once
#include "basics.h"
#include "precompiled header.h"
int main()
{
Basics::Print("Something"); // C2653 Basics is not a class or namespace name
}
основы.ч:
class Basics
{
public:
static void Print(const char* format, ...);
}
предварительно скомпилированный header.h:
#pragma once
#include <Windows.h>
// This header is than #included in a .cpp file.
Почему в вашем файле CPP есть #pragma once
?
@Элджей, почему бы и нет? Я делаю что-то неправильно?
#pragma once
должен гарантировать, что файл заголовок является включены только один раз. Файл CPP не является файлом заголовка.
@Eljay Eljay нередко помещают #pragma once
в исходный файл, потому что тогда он применяется ко всему, что включено в этот источник.
@MarkRansom • Сколько раз вы #include
*.cpp
файл в единице перевода? Или же я подозреваю, что один из нас не имеет четкого представления о #pragma once
.
@Eljay, насколько я понимаю #pragma once
, он указывает компилятору отслеживать включенные файлы и игнорировать любые #include
, которые он уже видел, независимо от расширения файла. Неважно, находится ли #pragma once
в источнике или в заголовке, он будет иметь тот же эффект — и этот эффект будет применяться ко всей единице перевода с этого момента.
@Элджей П.С. файлы заголовков нередко включают в себя другие заголовки, поэтому, даже если вы знать, вы включаете файл только после того, как #pragma once
может принести некоторую пользу.
@MarkRansom • мы не говорим о файлах заголовков, контекст помещает #pragma once
в исходный файл *.cpp
.
@Элджей, ты полностью упускаешь мою мысль! Неважно, находится ли pragma once
в источнике или в заголовке, или сколько их — достаточно одного, чем раньше, тем лучше. Я считаю, что Microsoft помещает один в каждый из своих стандартных включений.
@MarkRansom • Вы должны проверить свою гипотезу. Это не так. Прочтите ссылку, которую я дал в MSDN на #pragma once
. Это влияет только на файл, в котором он находится. (И поведение Microsoft не совсем такое же, как поведение GCC и Clang, но это отдельная проблема.)
Предварительно скомпилированный заголовок должен стоять первым в списке включения, потому что он стирает все, что идет до него.
Это решило мою проблему. Спасибо, основанный Чад
Разве предварительно скомпилированный заголовок не должен быть первым в каждой единице перевода?