2012-11-25 6 views
12

Per un semplice file proto:Esistono modi migliori per indirizzare gli avvisi durante la compilazione del file sorgente generato dal buffer del protocollo?

 
message Person { 
    required int32 id = 1; 
    required string name = 2; 
    optional string email = 3; 
} 

E 'stato compilato da protoc.exe ed i risultati vengono utilizzati in un progetto di test anche semplice, che non fa praticamente nulla, ma tra cui il ProtoC file generati.

Sto utilizzando la msvc10 per costruire il progetto di test (x64), poi mi ha dato un sacco di avvertimento:

 
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 

C'è un buon modo per affrontare tutti questi avvertimento? Qualsiasi suggerimento sarà molto apprezzato.

ps. il progetto libprotobuf stesso può essere pulito compilato da msvc10 senza alcun avviso.

[modifica 2013/02/20]

soluzione di lavoro: proprietà

  1. set per coloro ProtoC generati .cc file: proprietà
    configurazione -> C/C++ -> Avanzate - > disabilita avvertenze specifiche
+0

Dal buffer di protocollo sembra essere un progetto open source si potrebbe risolvere protoc.exe per generare codice migliore. – bames53

+1

Se sei sicuro che gli avvisi non sono un problema, puoi semplicemente spegnerli con '#pragma warning (disable: 4244, 4267, 4996)'. Vedi http://www.dr-bill.net/CSC076/class_summaries/3-26/pragmas.htm – cxxl

+0

@ bames53, eh ... che è un po 'fuori delle mie possibilità, sono solo curioso come questo problema è normalmente affrontato dal momento che il buffer di protocollo è così ampiamente utilizzato e perché non esiste un rilascio ufficiale di upadte sine l'anno scorso. –

risposta

8

Puoi hackerare il sorgente del compilatore di protoc per farlo iniettare la direttiva nei file generati automaticamente tutto y.

In src/google/protobuf/compiler/cpp/cpp_file.cc in GenerateHeader(io::Printer* printer) attorno alla riga 94, modificare la prima printer->Print chiamata a:

// 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); 

Poi, alla fine del the same function at around line 294, modificare l'ultima printer->Print chiamata a:

printer->Print(
    "#ifdef _MSC_VER\n" 
    "# pragma warning(pop)\n" 
    "#endif\n" 
    "\n" 
    "#endif // PROTOBUF_$filename_identifier$__INCLUDED\n", 
    "filename_identifier", filename_identifier); 

Ora basta è necessario compilare il target protoc ed eseguire il nuovo protoc.exe per avere il pragma nelle intestazioni generate.

+0

grazie, lo userò la prossima volta :) –

+0

Ho fatto lo stesso trucco per GenerateSource definito subito dopo GenerateHeaders. Ha funzionato alla grande, grazie! – Ben

+2

Questa è una soluzione molto interessante. Non mi dispiacerebbe trovare qualcosa di un po 'più ripetibile. Odio dover chiedere ai futuri sviluppatori di installare patch protobuf prima che vengano creati. Non c'è una soluzione CMake che funziona? In qualche modo ignorando gli avvertimenti solo su file specifici, come suggerito dall'OP, ma facendolo tramite CMake anziché VS? –

Problemi correlati