В С++ возможно ли включить все заголовки во все подпапки папки?

#include <iostream>
#include<eigen3/Eigen/src/Core/Matrix.h> // does not define Eigen::StorageOptions

// need something like this
#include<eigen3/Eigen/src/ everything_in_here >

int main()
{
    Eigen::Matrix<double,2,2> mat;
    std::cout << mat(0,0) <<std::endl;
    return 0;
}

Там я пытаюсь создать матричный объект, и он всегда запрашивает 6 параметров шаблона с сообщением об ошибке:

неправильное количество аргументов шаблона (3, должно быть 6)

Поэтому я начал добавлять их, 4-й — Eigen::StorageOptions и не определен в заголовке Matrix.h. Также слишком много заголовков для поиска. Итак, могу ли я включить туда все файлы одним #include?

Нет, но вы всегда можете создать заголовочный файл, который сделает это за вас (хотя это может быть не очень эффективно, обычно включает только то, что вы используете)

Pepijn Kramer 11.02.2023 09:42

В идеале в C++20 мы должны написать import eigen3;, чтобы просто и эффективно импортировать все заголовочные файлы.

prapin 11.02.2023 10:19

включает от /src/ ? Eigen/Dense уже должен быть тем заголовком, который вы ищете

463035818_is_not_a_number 11.02.2023 10:30

Хотя новички обычно стараются избегать этого (поэтому регулярно обращаются за советом о том, как включить сразу большое количество заголовков), обычно считается лучшей практикой включать только те заголовки, которые необходимы для каждого исходного файла. Это уменьшает зависимости, а также сокращает время инкрементной сборки (например, когда редактируются некоторые заголовки, нет необходимости перекомпилировать/пересобирать весь проект, что в больших проектах может сэкономить огромное количество времени в ожидании завершения сборки).

Peter 11.02.2023 10:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Нет, нет. Могут быть включены только отдельные файлы. (Хотя технически то, что это означает, определяется реализацией.) Препроцессор не имеет концепции файловой системы/каталога. Он рассматривает имена файлов, используемые в директивах #include, только как строки, а не пути.

Я также не знаю ни одного расширения компилятора для поддержки этого (хотя они могут быть).

Вы можете сгенерировать необходимые директивы #include в скрипте в качестве подготовительного шага в процессе сборки.

Можно ли использовать #include во время выполнения после поиска файлов в программе?

huseyin tugrul buyukisik 11.02.2023 09:42

@huseyintugrulbuyukisik Нет.

user17732522 11.02.2023 09:42

@huseyintugrulbuyukisik Вы можете написать сценарий на любом языке, чтобы добавить его в качестве подготовительного этапа в систему сборки. Он может сканировать каталог и записывать строки #include в файл заголовка, который затем можно включить.

user17732522 11.02.2023 09:44

Потому что это статическая компиляция, верно? Затем мне нужно создать строку кода C++ и скомпилировать ее во время выполнения со всеми перечисленными заголовками файлов.

huseyin tugrul buyukisik 11.02.2023 09:44

@huseyintugrulbuyukisik Это возможно, но, вероятно, гораздо больше работы, чем добавление, например. скрипт Python для системы сборки.

user17732522 11.02.2023 09:45

На самом деле у eigen уже есть список заголовков под названием Dense, но используемая мной IDE не находит его автоматически, поэтому мне пришлось написать его самому. Но было интересно, есть ли С++-способ сделать то же самое.

huseyin tugrul buyukisik 11.02.2023 09:50

@huseyintugrulbuyukisik Если у вас есть конкретная проблема с вашей IDE, вы должны описать эту реальную проблему (в новом вопросе).

chtz 11.02.2023 11:37

Вы не должны включать что-либо непосредственно из Eigen/src/.... Если вам нужны только основные компоненты Eigen, используйте

#include <Eigen/Core>

Если вы хотите включить все, что связано с плотными матричными операциями (например, разложением и модулем геометрии):

#include <Eigen/Dense>

Если вы также хотите включить модуль Sparse

#include <Eigen/Sparse>
// or this to include Dense+Sparse:
#include <Eigen/Eigen>

Вы должны убедиться с помощью параметров компиляции, что каталог Eigen верхнего уровня находится в вашем пути включения, например. во многих средах Linux добавьте -I/usr/include/eigen3 в качестве аргумента. Ваша IDE, вероятно, также имеет возможность для этого. Если вы используете что-то вроде CMake, для этого возникает множество связанных вопросов.

Если по какой-либо причине это не работает или вам просто нужен быстрый и грязный обходной путь, вы можете написать

#include <eigen3/Eigen/Core> //etc

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

huseyin tugrul buyukisik 11.02.2023 11:10

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