关于 not enough actual parameters for macro ...
From: http://blog.csdn.net/liyelun/article/details/5416253
今天修改工程,為了提高編譯速度,將#inclue<dshow.h>放到了stdafx.h中,然后重新編譯工程。結(jié)果有兩個(gè)文件編譯沒(méi)通過(guò),并且導(dǎo)致的編譯錯(cuò)誤近百個(gè)。
覺(jué)得奇怪,沒(méi)有什么大的改動(dòng)啊,難道是#include<dshow.h>搞的鬼?于是,將這條語(yǔ)句挪回原來(lái)的位置,重新編譯,通過(guò)了。
到底怎么回事?
又把這條語(yǔ)句放入stdafx.h中,重新編譯,仔細(xì)觀察出錯(cuò)編譯結(jié)果,第一個(gè)警告很讓人迷惑,warning C4003: not enough actual parameters for macro 'SubclassWindow'
SubClassWindow什么時(shí)候成宏了啊,記得是一個(gè)函數(shù)啊?說(shuō)不定是編譯器的錯(cuò)誤,不管了,往下看。下面的看了就頭大了,什么BOOL重新定義了,什么RECT定義找不到啊,一大堆根本不可能的錯(cuò)誤,難道編譯器真的出問(wèn)題了?
慢著,為什么說(shuō)SubclassWindow是宏呢?如果編譯器真的出問(wèn)題了,工程中其他使用RECT的文件怎么會(huì)順利編譯呢?直覺(jué)告訴我,和這個(gè)SubclassWindow有關(guān)。于是看了另外一個(gè)文件的出錯(cuò)信息,第一行是一個(gè)相同的warning。搜了一下工程,只有這兩個(gè)文件用到了subclasswindow,看來(lái)罪魁禍?zhǔn)滓呀?jīng)找到了。
如何解決呢?
警告信息寫(xiě)著呢,SubclassWindow這個(gè)宏的參數(shù)不夠,看來(lái)是有地方把它定義成宏了,那只要加入#undef SubclassWindow應(yīng)該就可以了。試了一下,果真可以了。
那到底是什么地方重新定義了SubclassWindow呢?在本地是不好找了,上baidu搜了一下,相關(guān)資料不多,但剛好有朋友碰到過(guò)相同的問(wèn)題,并且給出了詳細(xì)的解釋,下面那位朋友原文的轉(zhuǎn)發(fā)。
原來(lái)在一個(gè)項(xiàng)目中寫(xiě)好的類(lèi),運(yùn)行一直沒(méi)有問(wèn)題。這次為了版本升級(jí),重新包含在新的項(xiàng)目中,編譯始終報(bào)錯(cuò):
?
warning C4003: not enough actual parameters for macro 'SubclassWindow'
?
pWnd->SubclassWindow(m_hWndHooked);
?
源碼中這句話怎么也通不過(guò),這子類(lèi)化窗體哪里寫(xiě)錯(cuò)了?反復(fù)對(duì)比2個(gè)版本,沒(méi)有任何差異阿...
?
又把類(lèi)庫(kù)從頭到尾分析了一遍,足足花去3個(gè)小時(shí)!.... ....從源碼到編譯環(huán)境設(shè)置,都沒(méi)有什么差異阿...
?
實(shí)在想不通.
?
最后還是在MSDN里找到這個(gè)報(bào)告:
?
BUG: C4003: Not Enough Parameters for SubclassWindow Macro
Article ID : 150076
Last Review : September 18, 2003
Revision : 3.0
This article was previously published under Q150076
?
?
SYMPTOMS
When compiling a Microsoft Foundation Class (MFC) application that uses the Windowsx.h header file and calls CWnd::SubclassWindow(), you may get the following error:
?
?
warning C4003: not enough actual parameters for macro 'SubclassWindow' error C2059: syntax error : ')'
?
?
CAUSE
The Windowsx.h file is a header that includes message cracker macros to help programmers write more portable Windows-based applications. The header file contains a preprocessor macro named SubclassWindow. The macro bears the same name as the CWnd::SubclassWindow() member function. The macro has two parameters; the member function has only one parameter. The preprocessor tries to expand the symbol SubclassWindow when it is found.
?
?
RESOLUTION
You can un-define the macro as follows:
?
#undef SubclassWindow??????
?
因此,我的項(xiàng)目出錯(cuò)原因也很明顯了,因?yàn)镈show.h里面包含了windowsx.h。
總結(jié)
l???????? 一定要注意編譯器的異常警告信息
l???????? 修改工程配置或者改變文件包含關(guān)系的時(shí)候,最好能保證每次或者每幾次的改動(dòng)都是可編譯的,這樣會(huì)更容易定位錯(cuò)誤。
總結(jié)
以上是生活随笔為你收集整理的关于 not enough actual parameters for macro ...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 协作机器人关节模组总结
- 下一篇: **【ci框架】精通CodeIgnite