LINUX.ORG.RU

На сколько хорошо/плохо использовать char **envp в main?

 ,


0

1

Для того чтобы получить глобальные переменные окружения в С я использовал `getenv()`, но сейчас читая С код написанный для винды увидел там char *envp[] в качестве третьего аргумента функции main и я решил проверить будет ли это работать при компиляции с GCC/Clang и оно работает. Так вот вопрос, на сколько это правильно использовать этот аргумент в UNIX системах?

Это непортабельно и в POSIX не входит. Со всеми вытекающими из этого.

И стандартами C/C++ не описано.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от Deleted

envp заканчивается NULL указателем:

int count_envp_len(char* envp[]) {
    int j = 0;
    for (int i = 0;envp[i] != NULL;i++) {
        j = i;
    }

    return j;
    
}

int main(int argc, char const *argv[],char* envp[])
{
    printf("%i",count_envp_len(envp)); // выводит 59 у меня на системе
    return 0;
}

red_widowmaker
() автор топика
Ответ на: комментарий от red_widowmaker

envp заканчивается NULL указателем

Чёта не очень. Ну нах.

Deleted
()
Ответ на: комментарий от EXL

А для чего он там нужен?

Привычка. А так то да, не нужен.

Deleted
()
Ответ на: комментарий от red_widowmaker

Тут тоже: https://docs.microsoft.com/en-us/cpp/c-language/arguments-to-main?view=vs-2019

Вот только всё это компиляторо-специфичное. Если тебе нужен POSIX, чёткое соблюдение стандартов, возможность компилирования твоего кода на экзотических платформах – то лучше подобное не использовать. А если ориентируешься только на три кита – GCC, Clang/LLVM, Microsoft (R) C/C++ Optimizing Compiler – то и юзай в своё удовольствие.

EXL ★★★★★
()

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

использовать этот аргумент в UNIX системах?

Кошерно только POSIX где этой фичи нет, следовательно не нужно, если только очень надо для себя любимого, тогда проблем нет.

Deleted
()
Ответ на: комментарий от vtVitus

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

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

может быть выпилено в любой момент

Разумеется нет. Ты только представь обсуждение разработчиков компилятора, неизвестно, сколько программ это уже использует и поломается на путом месте. Кроме того такую безобидную фичу скорее добавят в стандарт.

anonymous
()
Ответ на: комментарий от Deleted

если ты переедешь на шланг/icc/твой_вариант никто тебе не будет гарантировать

Шланг стремится с к совместимости с gcc/msvc и поддерживает большинство расширений, кроме пары особо упоротых, которые намеренно не хотят реализовывать.

anonymous
()
Ответ на: комментарий от anonymous

Кроме того такую безобидную фичу скорее добавят в стандарт.

Оставить может и да, а во в стандарт ооочень сомневаюсь

Deleted
()

Если честно...

я использовал `getenv()`

Я бы рекомендовал использовать secure_getenv(). include file тот же, stdlib.h, но надо в начале сказать #define _GNU_SOURCE, т.к. это расширение GNU. https://linux.die.net/man/3/secure_getenv

увидел там char *envp[] в качестве третьего аргумента функции main

Использоваться **envp или char *envp[] может, но в стандарте на С99 про это ни чего не сказано. POSIX.1 тоже ни чего по данному поводу не говорит, так что, на свой страх и риск используйте, если хочется. Общепринятой практикой считается либо int main(void), либо int main(int argc, char **argv).

Но я бы всё таки через secure_getenv() работал.

Moisha_Liberman ★★
()
Ответ на: комментарий от anonymous

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

Deleted
()
Ответ на: комментарий от anonymous

А смысл?

Кроме того такую безобидную фичу скорее добавят в стандарт.

Зачем это в стандарте?

Moisha_Liberman ★★
()
Ответ на: комментарий от Deleted

Так надо было использовать c++ лямбды.

anonymous
()
Ответ на: комментарий от red_widowmaker
int count_envp_len(char* envp[]) {
    int i = 0;
    for (;envp[i] != NULL;++i);
    return i;   
}
tz4678 ★★
()

Как минимум, плохо следует принципу наименьшего удивления. Так же есть мысль, что это не портабельно де-юре.

onhydro
()

С т.з. стандарта это конформная implementation defined сигнатура, как и всякая ересь типа WinMain и проч.

d_a ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.