Mac OS POD类型检查中的C ++

时间:2018-11-01 15:15:30

标签: c++ macos variadic-functions

我具有以下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-pod-varargs]

gcc设置如下(gcc --version

  

配置为
  --prefix = /应用程序/Xcode.app/Contents/Developer/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类型检查。

是否有人遇到了同样的问题?


更新

调用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 :(得分:1)

%s格式说明符用于CString。您正在传递std::string。如果您改为这样做,它将起作用:string_format("%s %ld %ld %ld", label.c_str(), id, reference, value);