C ++ на MacOS проверка POD-типа - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть следующая функция C ++:

using namespace std;

template<typename ... Args>

string string_format( const std::string& format, Args ... args )
{
    size_t size = snprintf( nullptr, 0, format.c_str(), args ...) + 1; 
    std::unique_ptr<char[]> buf( new char[ size ] ); 
    snprintf( buf.get(), size, format.c_str(), args ... );
    return string( buf.get(), buf.get() + size - 1 ); 
}

Я могу скомпилировать его в среде Windows. Если я попробую на MacOS, используя gcc, я получу следующую ошибку:

не может передать объект нетривиального типа 'std :: __ 1 :: basic_string' через вариадическую функцию; вызов будет прерван во время выполнения [-Wnon-стручок-переменные аргументы]

gcc настроен следующим образом (gcc --version):

Настраивается с помощью
--prefix = / Приложения / Xcode.app / Содержание / Разработчик / usr
--with-gxx-include-dir = / usr / include / c ++ / 4.2.1

версия Apple LLVM: 10.0.0 (clang-1000.11.45.5)

Цель: x86_64-apple-darwin18.2.0

Модель резьбы posix

InstalledDir:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

Я думаю, что для gcc должны быть некоторые параметры, чтобы избежать проверки типа POD, о которой я не знаю.

Кто-то еще сталкивался с той же проблемой?


UPDATE

Пример кода, вызывающего функцию string_format:

class Node
{
public:
  int id;
  int reference;
  int value;
  std::string label;

  std::string describe()
  {
     return string_format("%s %ld %ld %ld", label, id, reference, value);
  } 
}

1 Ответ

0 голосов
/ 01 ноября 2018

Спецификатор формата %s предназначен для строки CString. Вы передаете std::string. Это будет работать, если вы сделаете это вместо: string_format("%s %ld %ld %ld", label.c_str(), id, reference, value);

...