5

Giả sử tôi đang làm việc trên một cơ sở mã lớn có cảnh báo w44101 được bật theo mặc định. Có nghĩa là nếu tôi đi vào dự án của tôi và nhấp chuột phải tài sản -> C/C++ -> Dòng lệnh ->/w44101 xuất hiện trong phần tùy chọn bổ sung.Làm thế nào để vô hiệu hóa cảnh báo cụ thể được thừa hưởng từ cha mẹ trong Visual Studio?

Tôi muốn có thể tắt cảnh báo này bằng cách thay đổi cấu hình thay vì mã nguồn. Tôi đã cố gắng đi vào tài sản -> C/C++ -> Tất cả các tùy chọn -> Vô hiệu hóa cảnh báo cụ thể và đặt trong 4101, và điều này thực sự sản xuất một thuộc tính /wd"4101" -> C/C++ -> Command Line. Tuy nhiên, khi tôi biên dịch dự án của tôi, nó vẫn ném cảnh báo 4101. Tại sao không /wd"4101"/w44101 hủy nhau?

Tôi đang sử dụng Windows 10 với Visual Studio 2015. Cách chính xác để tắt cảnh báo này là gì? Sẽ tốt hơn nếu các giải pháp được đề xuất có thể được gọi với một số loại hàm trong CMake vì tệp .sln của cơ sở mã này được tạo bởi CMake.

EDIT: Mã cơ sở này tôi đang làm việc trên có thiết lập cờ biên dịch chặt chẽ theo mặc định. Nó được biên dịch với /W4/WX. Cũng thêm mức 4 cảnh báo, đến tên một vài ví dụ, /w44101, /w44062, /w44191, vv

+0

Nhìn vào tiết xây dựng log. Lựa chọn nào cuối cùng trong lệnh biên dịch? Nếu cha mẹ đặt nó trong phần dòng lệnh, bạn có thể cũng muốn đặt nó trong phần dòng lệnh, chứ không phải trong phần "vô hiệu cảnh báo cụ thể". –

+0

@ n.m. Bạn có quyền ... Nếu tôi tự di chuyển 'wd4101' sang tùy chọn bổ sung SAU 'w44101' nó thực sự biên dịch. Bây giờ tôi chỉ cần tìm ra cách để làm điều này trong CMake. Nếu bạn biết xin đừng ngần ngại viết một câu trả lời và tôi sẽ chấp nhận nó. – user3667089

+0

Khắc phục sự thiếu nhất quán 4101 so với 44101 của bạn. Nếu bạn không thể sửa chữa câu hỏi của bạn, sau đó chúng tôi không muốn lãng phí thời gian giúp bạn khi bạn chứng minh rằng bạn không lắng nghe ý kiến ​​của chúng tôi. – Phil1970

Trả lời

7

Trong câu hỏi của bạn, bạn đang cho phép cảnh báo 44101 (mà không tồn tại nếu như tôi phải không?), Nhưng vô hiệu hóa cảnh báo 4101: đó có phải là lỗi đánh máy không?

EDIT:

Bạn đã trả lời này trong các ý kiến ​​của câu hỏi của bạn. Đọc MSDN documentation, /wlnnnn tùy chọn cho phép đặt mức cảnh báo tại l cho số cảnh báo được chỉ định bởi nnnn. Vì vậy, /w44101 bật số cảnh báo 4101 ở cấp 4.


Dù sao, nếu dự án của bạn được tạo ra với CMake, add_compile_options có thể được sử dụng để thêm tùy chọn để biên soạn các tập tin nguồn trong thư mục hiện hành. Điều này có thể được sử dụng để kích hoạt các cảnh báo 4101 ở "phạm vi toàn cầu":

add_compile_options(/w4101) 

Sau đó bạn có thể sử dụng target_compile_definitions để vô hiệu hóa nó mỗi mục tiêu:

add_library(foo ...) 
target_compile_definitions(foo PUBLIC /wd4101) 

EDIT:

Từ nhận xét của bạn, trong đầu tệp CMake của repo có:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /w44101") 

Và trong dự án của bạn CMake nộp bạn cố gắng để làm:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4101") 

Những gì bạn cần làm là loại bỏ các /w44101 từ CMAKE_CXX_FLAGS.Bạn có thể đạt được điều này sử dụng để thay thế string(REPLACE ...)/w44101 với một chuỗi rỗng:

string(REPLACE "/w44101" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 

Rõ ràng, giải pháp tốt nhất là để sửa chữa các mã tạo ra các cảnh báo. 4101 là về biến không sử dụng, đó là dễ dàng để sửa chữa;)

(xem câu hỏi liên quan "How do I best silence a warning about unused variables?")

+0

4101 được sử dụng làm ví dụ vì dễ tái sản xuất. Trong đầu CMakeList của repo có 'set (CMAKE_CXX_FLAGS" $ {CMAKE_CXX_FLAGS}/w44101 ")', và trong dự án của tôi CMakeList tôi cố gắng làm 'set (CMAKE_CXX_FLAGS" $ {CMAKE_CXX_FLAGS}/wd4101 ")' nhưng nó đã không 't làm việc. Tôi trao đổi chúng với 'add_compile_options' và' target_compile_definitions' của bạn nhưng vẫn cảnh báo được ném. Nó có hoạt động đúng không? – user3667089

+0

@ user3667089 Tôi không bao giờ tắt cảnh báo, vì vậy tôi đã không kiểm tra nó;) Tôi đã chỉnh sửa câu trả lời của mình với một đề xuất khác, dựa trên thông tin bổ sung của bạn. Một lần nữa, giải pháp tốt nhất là sửa mã. Cảnh báo có thể chỉ mã không đáng tin cậy và nên được coi là lỗi – wasthishelpful

+0

Tôi đã thử 'danh sách (REMOVE_ITEM CMAKE_CXX_FLAGS/w44101)' nhưng nó vẫn ném cảnh báo cho tôi. Nó có hoạt động đúng không? – user3667089

Các vấn đề liên quan