Включение предварительно скомпилированного заголовка и непредварительно скомпилированного заголовка в файл .cpp приводит к тому, что файл .cpp не распознает непредварительно скомпилированный заголовок.

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 могут? Вы действительно хотите предварительно скомпилировать заголовки + включить заголовки в другие заголовки, которые в них нуждаются.

Разве предварительно скомпилированный заголовок не должен быть первым в каждой единице перевода?

Vlad Feinstein 16.05.2022 21:00

Почему в вашем файле CPP есть #pragma once?

Eljay 16.05.2022 21:00

@Элджей, почему бы и нет? Я делаю что-то неправильно?

Oskar Kierakowicz 16.05.2022 21:02
Почему нет? Поскольку #pragma once должен гарантировать, что файл заголовок является включены только один раз. Файл CPP не является файлом заголовка.
Eljay 16.05.2022 21:04

@Eljay Eljay нередко помещают #pragma once в исходный файл, потому что тогда он применяется ко всему, что включено в этот источник.

Mark Ransom 16.05.2022 21:08

@MarkRansom • Сколько раз вы #include*.cpp файл в единице перевода? Или же я подозреваю, что один из нас не имеет четкого представления о #pragma once.

Eljay 17.05.2022 01:22

@Eljay, насколько я понимаю #pragma once, он указывает компилятору отслеживать включенные файлы и игнорировать любые #include, которые он уже видел, независимо от расширения файла. Неважно, находится ли #pragma once в источнике или в заголовке, он будет иметь тот же эффект — и этот эффект будет применяться ко всей единице перевода с этого момента.

Mark Ransom 17.05.2022 05:50

@Элджей П.С. файлы заголовков нередко включают в себя другие заголовки, поэтому, даже если вы знать, вы включаете файл только после того, как #pragma once может принести некоторую пользу.

Mark Ransom 17.05.2022 05:53

@MarkRansom • мы не говорим о файлах заголовков, контекст помещает #pragma once в исходный файл *.cpp.

Eljay 17.05.2022 14:14

@Элджей, ты полностью упускаешь мою мысль! Неважно, находится ли pragma once в источнике или в заголовке, или сколько их — достаточно одного, чем раньше, тем лучше. Я считаю, что Microsoft помещает один в каждый из своих стандартных включений.

Mark Ransom 17.05.2022 14:25

@MarkRansom • Вы должны проверить свою гипотезу. Это не так. Прочтите ссылку, которую я дал в MSDN на #pragma once. Это влияет только на файл, в котором он находится. (И поведение Microsoft не совсем такое же, как поведение GCC и Clang, но это отдельная проблема.)

Eljay 17.05.2022 15:50
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
11
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предварительно скомпилированный заголовок должен стоять первым в списке включения, потому что он стирает все, что идет до него.

Это решило мою проблему. Спасибо, основанный Чад

Oskar Kierakowicz 16.05.2022 21:01

Другие вопросы по теме