Ты не работаешь со строками. Вы работаете с указателями.
var1
- это указатель на символ (const char*
). Это не строка. Если он завершается нулем, то некоторые функции C будут обрабатывать как строку, но в основном это просто указатель.
Таким образом, когда вы сравниваете его с массивом char, массив также распадается на указатель, и компилятор затем пытается найти operator == (const char*, const char*)
.
Такой оператор существует. Он принимает два указателя и возвращает true
, если они указывают на один и тот же адрес. Таким образом, компилятор вызывает это, и ваш код ломается.
Если вы хотите сравнивать строки, вы должны указать компилятору, что вы хотите иметь дело с строками , а не указателями .
C способ сделать это - использовать функцию strcmp
:
strcmp(var1, "dev");
Возвращает ноль, если две строки равны . (Будет возвращено значение больше нуля, если левая сторона лексикографически больше правой части, а значение меньше нуля в противном случае.)
Итак, для сравнения на равенство вам нужно сделать одно из них:
if (!strcmp(var1, "dev")){...}
if (strcmp(var1, "dev") == 0) {...}
Однако в C ++ есть очень полезный класс string
. Если мы используем это, ваш код становится немного проще. Конечно, мы можем создавать строки из обоих аргументов, но нам нужно сделать это только с одним из них:
std::string var1 = getenv("myEnvVar");
if(var1 == "dev")
{
// do stuff
}
Теперь компилятор встречает сравнение между строкой и указателем на символ. Он может справиться с этим, потому что указатель на символ может быть неявно преобразован в строку, что дает сравнение строк / строк. И они ведут себя точно так, как вы ожидаете.