簡體   English   中英

將CString傳遞給fprintf

[英]Pass CString to fprintf

我已經在Visual Studio中運行代碼分析器在一個大型代碼庫上,我得到了大約10億這個錯誤:

warning C6284: Object passed as parameter '3' when string is required in call to 'fprintf'

根據http://msdn.microsoft.com/en-us/library/ta308ywy.aspx “這個缺陷可能會產生錯誤的輸出或崩潰。” 然而,我的同事說我們可以毫無問題地忽略所有這些錯誤。 所以我的一個問題是我們需要對此做些什么,還是我們可以保留原樣?

如果需要解決這些錯誤,最好的解決方法是什么?

會這樣做是這樣的:

static_cast<const char*>(someCString)

對此有更好或更正確的方法嗎?

以下行生成此警告:

CString str;
fprintf(pFile, "text %s", str);

我假設您將Microsoft“CString”對象傳遞給printf() - 族函數,其中相應的格式說明符為%s 如果我是對的,那么你的答案就在這里: 如何將CString傳遞給格式字符串%s? (簡而言之,您的代碼沒問題)。

似乎最初的實現細節允許CString直接傳遞給printf(),后來它成為合同的一部分。 所以你很高興你的程序正確,但如果你想避免靜態分析警告,你可能確實需要使用static_cast到char指針。 我不確定它在這里是否值得...也許還有其他一些方法可以讓這些工具放在一起,因為它們都來自微軟。

根據C6284中的MSDN建議,您可以拋棄警告 使用C ++強制轉換是最易於維護的選項。 您上面的示例將更改為

fprintf(pFile, "text %s", static_cast<const TCHAR*>(str));

或者,只是另一種拼寫

fprintf(pFile, "text %s", static_cast<LPCTSTR>(str));

最有說服力的選擇100%無鑄造 ,參見編輯部分)是

fprintf(pFile, "text %s", str.GetString());

當然,遵循任何這些變化模式將是第一個移植步驟,如果沒有任何表明需要它,這可能是有害的 (不僅對您的團隊氛圍)。


編輯:(根據xMRi的評論)

1)我添加了const因為參數對於fprintf是只讀的

2)無鑄解決方案的注釋CSimpleStringT :: GetStringCSimpleStringT類模板用於CStringT的定義, CStringT再次用於CSimpleStringT原始問題中使用的類CString

3)重新設計的答案以消除噪音。

4)減少關於鑄造選項的介紹

從技術上講,它是可以的,因為c-string以這種方式存儲在CString中,您可以按照說明使用它,但是依賴於如何實現CString來執行快捷方式並不好。 printf是一個C-runtime函數,對C ++對象一無所知,但這里依賴的是字符串首先存儲在CString中 - 一個實現細節。

如果我沒記錯,最初CString無法以這種方式使用,並且必須將CString轉換為c-string以將其打印出來,但在以后的版本中,MS更改了實現以允許將其視為c-string。

另一個突破問題是UNICODE,如果你有一天決定使用UNICODE字符集編譯程序肯定不會起作用,因為即使你將所有字符串格式化程序更改為%ld,嵌入式0也有時會阻止字符串被打印。

實際問題是為什么使用printf而不是C ++來打印/寫入文件?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM