Передача всех аргументов функции к другой функции

Участие Autotools заканчивается в точке, где встроенные артефакты установлены в системе. Использование не позволяет использовать Autotools. * Это применимо так же, когда установленные артефакты являются библиотеками и заголовками, так же как и когда они являются исполняемыми файлами. Нет ничего особенного или отличного в использовании программ или библиотек, созданных Autotools.

Я строю свой проект с помощью cmake и хотел бы иметь кроссплатформенное решение с ним. Однако я был бы рад использовать команду pkg-config.

Как и проекты, обслуживаемые любой другой системой сборки, проекты Autotools могут создавать и устанавливать файлы конфигурации pkg-config, или макросы CMake, или любые другие фрагменты, которые они могут посчитать необходимыми, чтобы помочь пользователям, но это конкретный проект. Автоинструменты не создают такие дополнительные части по своему усмотрению, но некоторые проекты, основанные на Автоинструментах, добавляют их. А некоторые нет, как некоторые проекты CMake, а некоторые проекты с системами сборки, созданными вручную, и т. Д.

Кто-нибудь знает, каков «правильный» / «рекомендуемый» способ получения cflags, или, по крайней мере, вариант, в котором мне не нужно жестко кодировать пути?

[118 ] Обратите внимание, что обычно для библиотеки, имя которой вы знаете, единственными флагами, которые вам могут понадобиться, являются те, которые указывают расположение заголовков библиотеки и / или один, указывающий местоположение самих библиотек. Даже они не нужны, если соответствующие части установлены в местах, которые компилятор смотрит по умолчанию. Также они обычно не считаются CFLAGS, per se . Терминология немного отличается, но первый - это флаг препроцессора, а второй - флаг ссылки.

Поскольку вы используете CMake, вы можете подумать о написании кода CMake для поиска в вероятных каталогах искомых библиотек и заголовков, а также для установки результатов в подходящих переменных для использования другим кодом. Это скорее подход в стиле Autotools. В качестве альтернативы, вы можете определить пользовательскую переменную, с помощью которой в CMake могут быть указаны нужные местоположения. Это предполагает, что сторонний проект еще не предоставляет что-то полезное для этой цели. Или, если разрешить лицензирование, вы можете упаковать стороннюю библиотеку вместе со своей, чтобы вы могли контролировать, где она будет установлена.

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


* Может быть сделано исключение для использования архивов libtool , которые проект Autotools может установить вместе с обычными библиотеками - если кто-то захочет использовать их, они будет прямо или косвенно проходить через libtool. Но на практике это произойдет только в другом проекте Autotools.

62
задан Anderson Green 19 March 2014 в 02:40
поделиться

3 ответа

Явный лучше, чем неявный , но если вы действительно не хотите вводить несколько символов:

def func1(a=1, b=2, c=3):
    func2(**locals())

locals () - все локальные переменные, поэтому вы не можете установить какие-либо дополнительные переменные перед вызовом func2 , иначе они тоже будут пропущены.

54
ответ дан 24 November 2019 в 16:53
поделиться

Как другие сказали, использование locals() могло бы заставить Вас передавать больше переменных, чем предназначенный, если func1() создает новые переменные прежде, чем звонить func2().

Это, может обойтись путем вызова locals() как первая вещь, как так:

def func1(a=1, b=2,c=3):
    par = locals()

    d = par["a"] + par["b"]

    func2(**par)
0
ответ дан 24 November 2019 в 16:53
поделиться

При условии, что аргументы функции func1 являются только аргументами ключевого слова, вы можете сделать это:

def func1(a=1, b=2, c=3):
    func2(**locals())
13
ответ дан 24 November 2019 в 16:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: