Как пропустить задание Jenkins, запускаемое пакетом Gerrit на основе коммита msg

Вы не работаете со строками. Вы работаете с указателями. var1 - указатель на символ (const char*). Это не строка. Если оно завершено нулем, то некоторые C-функции будут обрабатывать как строку, но в основном это просто указатель.

Поэтому, когда вы сравниваете его с массивом символов, массив распадается на указатель, а затем компилятор пытается найти operator == (const char*, const char*).

Такой оператор существует. Он принимает два указателя и возвращает true, если они указывают на один и тот же адрес. Таким образом, компилятор вызывает это, и ваш код прерывается.

ЕСЛИ вы хотите провести сравнение строк, вы должны сообщить компилятору, что хотите иметь дело с строками , а не указатели .

Для этого нужно использовать функцию 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
}

Теперь компилятор встречает сравнение между строкой и указателем char. Он может справиться с этим, поскольку указатель char может быть неявно преобразован в строку, что дает сравнение строк и строк. И они ведут себя точно так, как вы ожидали.

0
задан Prisco 20 January 2019 в 12:41
поделиться

1 ответ

Когда задание запускается созданием набора патчей, вы можете начать с проверки переменной $ GERRIT_CHANGE_SUBJECT и, если это так, остановить процесс.

0
ответ дан Marcelo Ávila de Oliveira 20 January 2019 в 12:41
поделиться
Другие вопросы по тегам:

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