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:
Protocol buffers are much faster than JSON. JSON is lightweight and is faster than other serialization techniques like pickling. Advantages: Protobuf schemas are encoded along with data; it ensures that signals don't get lost between applications.
Protocol buffers are ideal for any situation in which you need to serialize structured, record-like, typed data in a language-neutral, platform-neutral, extensible manner. They are most often used for defining communications protocols (together with gRPC) and for data storage.
Protocol Buffers (Protobuf) is a free and open-source cross-platform data format used to serialize structured data. It is useful in developing programs to communicate with each other over a network or for storing data.
A simple approach is to use a wrapper header for including the generated protobuf headers:
#ifndef MESSAGES_WRAPPER_H
#define MESSAGES_WRAPPER_H
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4018 4100 4267)
#endif
#include "messages.pb.h"
#ifdef _MSC_VER
#pragma warning(pop)
#endif
#endif // MESSAGES_WRAPPER_H
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.
I didn't much like hacking protoc sources due to maintenance burden, so I come up with simpler solution.
You are probably already generating the files using some kind of script as you need to pass many parameters to protoc, so it's is pretty easy to customize this script further.
I created powershell script that post-processes generated files and adds #include "Grpc.Header.h"
at the start of the generated files, and #include "Grpc.Footer.h"
at the end of said files. You can then customize those header files when placed in you project. Besides disabling warnings with #pragma warning
, I could also introduce other changes easily when needed.
NOTE: in this example I generated additional #define
that my project needed, as well as precompiled header support that is nice for MSVC. I'm leaving this in the example to illustrate what you can do but it can be safely removed. dllexport_decl=MYAPI
allows to export protobuf classes in you dll project.
GenerateProto.ps1:
$ProjectDirectory = "My\Project\Directory\"
$ProtoDirectory = "My\Proto\Directory"
protoc --proto_path=$ProtoDirectory --cpp_out=dllexport_decl=MYAPI:$ProjectDirectory universe.proto
$Plugin = where.exe grpc_cpp_plugin
protoc --proto_path=$ProtoDirectory --grpc_out=$ProjectDirectory --plugin=protoc-gen-grpc=$Plugin universe.proto
foreach($File in Get-ChildItem $ProjectDirectory* -Include *.pb.cc, *.pb.h )
{
$Content = Get-Content $File
if( $File.FullName.EndsWith(".cc"))
{
Set-Content $File "#include `"pch.h`""
Add-Content $File "#include `"Grpc.Header.h`""
}
else
{
Set-Content $File "#include `"Grpc.Header.h`""
}
Add-Content $File $Content
Add-Content $File "#include `"Grpc.Footer.h`""
}
Grpc.Header.h:
#pragma warning(push)
#pragma warning(disable: 4251)
#ifdef API_EXPORT
# define MYAPI __declspec(dllexport)
#else
# define MYAPI __declspec(dllimport)
#endif
Grpc.Footer.h:
#pragma warning(pop)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With