Ознакомившись с кодом, я считаю, что цель состоит в том, чтобы он вызывал getenv
при первом вызове, кешировал результат, а затем после этого использовал кешированный результат без необходимости звонить getenv
. Если getenv
используется со строковым литералом, то все последующие вызовы будут запрашивать одну и ту же переменную среды; если ничто не может изменить эту переменную среды, они, следовательно, возвратят тот же результат. Если в коде был указан указатель на строку, которая впоследствии была изменена, результат кэширования, скорее всего, не был бы правильным для новой строки, поэтому цель трюка - убедиться, что этого не произойдет.
Поскольку каждый строковый литерал, который может быть использован, должен иметь связанную с ним статическую переменную, указанный фрагмент кода не может быть разумно преобразован в функцию. С другой стороны, количество кода, необходимого для каждого повторения, выглядит немного. Кроме того, если одна и та же переменная тестируется более чем в одном месте в коде, каждый из них может иметь свой собственный набор переменных и код проверки среды.
В зависимости от того, как эта функция будет использоваться, она может оказаться намного быстрее, чем код, который должен проверять переменную окружения каждый раз, когда он вызывается, и может использоваться из функции, вызываемой в цикле без (если клиентский код называется функцией «предварительной настройки», там должен быть проверен поиск имени, что исключает необходимость проверки внутри цикла, чтобы проверить, был ли поиск выполнен).
Я не думаю, что это расширение ... –
@EugeneSh. конкретная строка, о которой я говорил, - нет, но контекст, в котором он использовался, равен :) – OMGtechy
Ну, тогда название, вероятно, немного вводит в заблуждение. –