C передача массива строк в функцию

#c

#c

Вопрос:

Итак, я хочу передать массив std::strings в функцию. Количество std::strings в массиве предопределено с помощью preproc. directives. Все это должно выглядеть следующим образом:

 #define ARRAYSIZE 3
void foo(std::string[ARRAYSIZE]);
void foo(std::string instrings[ARRAYSIZE])
{
...
}
  

Вопрос: Могу ли я вызвать функцию без необходимости сначала сохранять массив std::string в переменную, а затем вызывать с ее помощью? Итак, в основном я хочу вызвать его с помощью одной строки, например:

 void main()
{
...
foo( std::string x[ARRAYSIZE] = {"abc","def","ghi"}  );
...
}
  

Проблема в том, что я не могу определить правильный синтаксис вызова функции (я даже не уверен, что он существует), visual studio intellisense продолжает отбрасывать мои идеи.

Комментарии:

1. Использование std::array и std::vector полезно для души.

2. #define для констант совершенно не нужно. Вместо этого используйте const or constexpr .

3. @chris Я бы сказал, что это зависит от области видимости. Если я должен использовать одинаковую длину массива для нескольких несвязанных функций, и длина должна быть точно такой же, я бы использовал define . Но опять же, это не совсем лучшая практика, и это с точки зрения C … в конце концов, это действительно не имеет значения.

4. @rath, вы можете использовать глобальную константу, если вам действительно нужно. По крайней мере, на самом деле это объект, который подчиняется правилам определения области видимости, а не просто заменяемый текст.

5. @chris 1, аргумент замены текста имеет смысл.

Ответ №1:

Если вы хотели бы переключиться на std::vector который может быть создан «на лету», как вы упомянули в комментарии к вопросу, это должно сработать (работает с gcc):

 void foo(const std::vector<std::string> amp;stringVec)
{
}

int main()
{
    foo( std::vector<std::string>({"abc","def","ghi"}));
}
  

Комментарии:

1. Спасибо, это работает! 🙂 Мне пришлось переписать foo, чтобы он ожидал вектор, что означает, что компилятор больше не проверяет размер массива, он принимает любой вектор строк, но я могу просто проверить это сам и выдать какое-нибудь ужасное сообщение об ошибке, если размер не равен ARRAYSIZE

Ответ №2:

Одним из способов передачи нескольких значений, подобных этому {x0,x1,x2,…}, было бы использование std::initializer_list, который был введен в c 11. Хотя таким образом невозможно принудительно ввести постоянное количество значений.

 void foo(const std::initializer_list<std::string>amp; input) {

}

int main() {
    foo({"abc","def","ghi"});
}