For a simple proto file:
message Person { required int32 id = 1; required string name = 2; optional string email = 3; }
It's been compiled by protoc.exe and the results are used in an also simple test project, which basically does nothing but including the protoc generated files.
I'm using the msvc10 to build the test project (x64), then it gave me a lot of warning:
Warning 1 warning C4244: 'return' : conversion from '__int64' to 'int', possible loss of data D:\Work\protobuf-trunk\src\google\protobuf\descriptor.h 1441 1 testProtobuf ... Warning 11 warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data D:\Work\protobuf-trunk\src\google\protobuf\unknown_field_set.h 142 1 testProtobuf Warning 12 warning C4267: 'return' : conversion from 'size_t' to 'int', possible loss of data D:\Work\protobuf-trunk\src\google\protobuf\unknown_field_set.h 237 1 testProtobuf ... Warning 14 warning C4244: '=' : conversion from '__int64' to 'int', possible loss of data D:\Work\protobuf-trunk\src\google\protobuf\io\coded_stream.h 902 1 testProtobuf Warning 15 warning C4244: 'return' : conversion from '__int64' to 'int', possible loss of data D:\Work\protobuf-trunk\src\google\protobuf\io\coded_stream.h 1078 1 testProtobuf Warning 16 warning C4267: 'argument' : conversion from 'size_t' to 'google::protobuf::uint32', possible loss of data D:\Work\protobuf-trunk\src\google\protobuf\wire_format_lite_inl.h 663 1 testProtobuf ... Warning 19 warning C4267: 'return' : conversion from 'size_t' to 'int', possible loss of data D:\Work\protobuf-trunk\src\google\protobuf\wire_format_lite_inl.h 739 1 testProtobuf Warning 20 warning C4267: 'argument' : conversion from 'size_t' to 'google::protobuf::uint32', possible loss of data D:\Work\protobuf-trunk\src\google\protobuf\wire_format_lite_inl.h 742 1 testProtobuf Warning 21 warning C4267: 'return' : conversion from 'size_t' to 'int', possible loss of data D:\Work\protobuf-trunk\src\google\protobuf\wire_format_lite_inl.h 743 1 testProtobuf Warning 22 warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data D:\Work\testProtobuf\testProtobuf\person.pb.cc 211 1 testProtobuf ... Warning 28 warning C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility 2239 1 testProtobuf Warning 29 warning C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility 2239 1 testProtobuf
Is there any good way to address all of these warning? Any suggestions will be greatly appreciated.
ps. the libprotobuf project itself can be clean compiled by msvc10 without any warning.
[edit 2013/02/20]
working solution:
You can hack the source of the protoc compiler to have it inject the pragmas into the generated files automatically.
In src/google/protobuf/compiler/cpp/cpp_file.cc in GenerateHeader(io::Printer* printer)
around line 94, change the first printer->Print
call to:
// Generate top of header.
printer->Print(
"// Generated by the protocol buffer compiler. DO NOT EDIT!\n"
"// source: $filename$\n"
"\n"
"#ifndef PROTOBUF_$filename_identifier$__INCLUDED\n"
"#define PROTOBUF_$filename_identifier$__INCLUDED\n"
"\n"
"#ifdef _MSC_VER\n"
"# pragma warning(push)\n"
"# pragma warning(disable: 4127 4244 4267)\n"
"#endif\n"
"\n"
"#include <string>\n"
"\n",
"filename", file_->name(),
"filename_identifier", filename_identifier);
Then at the end of the same function at around line 294, change the last printer->Print
call to:
printer->Print(
"#ifdef _MSC_VER\n"
"# pragma warning(pop)\n"
"#endif\n"
"\n"
"#endif // PROTOBUF_$filename_identifier$__INCLUDED\n",
"filename_identifier", filename_identifier);
Now you just need to compile the protoc target and run the new protoc.exe to have the pragmas in the generated headers.