1. 程式人生 > >C++中的巨集和函式名稱的衝突 STL+windows.h

C++中的巨集和函式名稱的衝突 STL+windows.h

最近在寫程式碼的時候總是發現在#include"windows.h"了以後經常用STL中的min.max函數出現編譯錯誤。但是自認為程式碼是沒有錯誤的。下面就是相關的程式碼:

這裡的numeric_limits模板類和那個std::max都不約而同的遇上了編譯錯誤:

1>c:/project/testapplication/c++/testmacro/testmacro/testmacro.cpp(12) : error C2589: '(' : illegal token on right side of '::'
1>c:/project/testapplication/c++/testmacro/testmacro/testmacro.cpp(12) : error C2059: syntax error : '::'

搜尋了網上看到了這個帖子.確實衝突是存在的。在#include"windows.h"之後,編譯器把這裡的max()呼叫都用windef.h裡面的巨集展開了.

說明巨集的替換是發生在語法分析之前的。當然解決方案也是有的。最簡單的方案就是在工程編譯的時候新增一個NOMINMAX的巨集,那樣這些巨集就不會編譯在裡面,那問題也解決了。還有一個辦法就是你在呼叫函式的時候都加上括號,讓函式看上去想函式指標一樣:

雖然這樣的話,問題解決了。但是留給我們更多的想法是函式名稱定義上需要注意的地方。如果我自己定義一個類,然後裡面的函式名是max或者min的話,是不是在呼叫的時候也有一樣的問題呢??回答是肯定的。還是前面的例子。

嘗試加入一個Test類,裡面有一個max函式。這裡不需要呼叫就不能通過編譯,因為編譯器已經給你做了展開。

1>c:/project/testapplication/c++/testmacro/testmacro/testmacro.cpp(12) : warning C4003: not enough actual parameters for macro 'max'
1>c:/project/testapplication/c++/testmacro/testmacro/testmacro.cpp(12) : error C2059: syntax error : ')'
1>c:/project/testapplication/c++/testmacro/testmacro/testmacro.cpp(12) : error C2334: unexpected token(s) preceding ':'; skipping apparent function body

這個就是相關的錯誤。給我們的提醒就是函式名稱的定義不要和巨集定義的名稱相同,或者說在C++裡面儘量不要用巨集!