2012-01-06 40 views
3

之前預期的初始化我有cdecl調用約定一個問題:CDECL錯誤:

void Test1(char* str, ...)   // ok 
{} 

void cdecl Test2(char* str, ...)  // error: expected initializer before 'Test2' 
{} 

int main() 
{} 

我應該怎麼做才能讓編譯器識別cdecl調用約定?

謝謝!

平臺:Windows 7; MinGW的; GCC 4.6.1


我不能修改這些功能,因爲它們是 「Microsoft Excel中開發人員工具包,版本14」 的一部分,在文件FRAMEWRK.H:

///*************************************************************************** 
// File:  FRAMEWRK.H 
// 
// Purpose:  Header file for Framework library 
// 
// Platform: Microsoft Windows 
//... 
// From the Microsoft Excel Developer's Kit, Version 14 
// Copyright (c) 1997 - 2010 Microsoft Corporation. All rights reserved. 
///*************************************************************************** 
... 
// 
// Function prototypes 
// 

#ifdef __cplusplus 
extern "C" { 
#endif 

void far cdecl debugPrintf(LPSTR lpFormat, ...); 
LPSTR GetTempMemory(size_t cBytes); 
void FreeAllTempMemory(void); 
... 

回答

1

編輯注:這個答案(和所有類似的答案)在技術上是不正確的,如下面的評論所示。我不會刪除它,這樣我們就不會丟失評論。 (編輯完

預置它以兩個下劃線,就像這樣:__cdecl

+0

問題是該函數是「Microsoft Excel Developer's Kit,版本14」(FRAMEWRK.H)的一部分。我想我不應該修改它。 – 2012-01-06 12:13:50

+2

在這種情況下,我認爲FRAMEWRK.H應該用於MSVC,而不是GCC。在包含頭文件之前,看看你是否可以放入類似'#define cdecl __cdecl'的東西。但我擔心這只是冰山一角。 – 2012-01-06 12:27:46

+0

@MrLister:你對'#define cdecl __cdecl'和冰山都是正確的......現在我得到關於聲明的未聲明函數(例如'memcpy_s')的錯誤;他們是全球性的,包括和路徑設置。 – 2012-01-06 14:32:34

1

這是C和C++程序的默認調用約定。放置__cdecl修飾符的變量或編譯器指令用C命名和調用約定爲系統函數的函數名

前:

// Example of the __cdecl keyword 
_CRTIMP int __cdecl system(const char *); 

在微軟的cdecl的文檔見here

+1

如果您要複製代碼,則還應聲明源代碼 - http://msdn.microsoft.com/en-us/library/zkwh89ks(v=vs.71).aspx – 2012-01-06 12:13:56

+0

好的。我正在編輯那部分,因爲我之前忘了這麼做..對不起.. – 2012-01-06 12:15:02