簡體   English   中英

如何使替換 c function 的變量名出錯?

[英]How do I make variable names that replace a c function an error?

我的代碼神秘地停止工作。 我發現我不小心寫了int listen; 在我的main.cpp中並在我的network.cpp中使用了 listen 似乎試圖將 int 稱為 function 而不是 C ZC1C425268E68385D1AB5074C17A94F1。 更改變量的名稱(或使其成為靜態)解決了這個問題。

有沒有我可以打開的警告,這樣我就不會再被這樣的事情抓住了? 我發現的最接近的是建議我制作變量 static 如果它們不需要是 extern

繼承人代碼

//a.cpp
#include<cstdio>
int main() { puts("Hello"); }

//b.cpp
int puts;

您所擁有的是違反 ODR 的行為。 在兩個不同的puts中有兩個不同的 put 定義。 標准(N4713 - C++17 草案)說

§6.2 單一定義規則 [basic.def.odr]

  1. 每個程序都應包含每個非內聯 function 或在該程序中在廢棄語句之外使用的變量的一個定義 (9.4.1); 無需診斷。

這當然適用於 C++。 C 也有類似的規則。

由於“不需要診斷”,編譯器鏈不需要為您的代碼發出錯誤或警告。

據我所知,流行的編譯器上沒有針對 ODR 違規發出錯誤/警告的標志。 這是因為編譯器如何優化其解析。 有關更多信息,請參閱這個很好的答案

您可以遵循一些好的做法來盡量減少此類錯誤:

  • 在 C++ 中不要在全局空間聲明符號。 使用命名空間。

  • 在 C 中,您可以在全局變量前面加上g_ 如果您編寫一個庫,您還將為所有全局內容添加一個庫前綴。

  • (正如您所建議的)使僅在其 TU 中使用的符號具有內部鏈接(將它們聲明為static或在未命名的命名空間中)。

  • 使用更有意義、相關的名稱。 例如,您可以將其命名為server_is_listening (或對其使用有意義的類似名稱),而不是listen

-Werror=missing-variable-declarations可能會有所幫助。 它迫使您使用 static 以避免此問題或在其他地方聲明變量(即標頭)。 在包含 C function 的任何文件中包含 header 將導致錯誤,從而導致另一個機會捕獲錯誤

暫無
暫無

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

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