2012-01-06 1 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


Я не могу изменить эти функции, так как они являются частью "Kit 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

РЕДАКТИРОВАНИЕ Примечание : этот ответ (и все аналогичные ему ответы) технически неверен, как показывают приведенные ниже комментарии. Я не удаляю его, чтобы мы не теряли комментарии. (END EDIT)

Prepend это с двумя символами подчеркивания, например: __cdecl

+0

Проблема в том, что эта функция является частью «Microsoft Developer Developer Kit Kit, версия 14» (FRAMEWRK.H). Думаю, мне не следует изменять его. –

+2

В этом случае я думаю, что FRAMEWRK.H предназначался для использования с MSVC, а не с GCC. Посмотрите, можете ли вы поместить что-то вроде '#define cdecl __cdecl' перед включением файла заголовка. Но я боюсь, что это только верхушка айсберга. –

+0

@MrLister: вы были правы как о '#define cdecl __cdecl', так и об айсберге ... Теперь я получаю ошибки в объявленных незанятых функциях (например,' memcpy_s'); они являются глобальными, включены и установлены путь. –

1

Это по умолчанию соглашение о вызовах для программ C и C++. Поместите модификатор __cdecl перед переменной или именем функции

Компилятор проинструктирован использовать C именовании и вызове системной функции:

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

См here для документации Cdecl в Microsoft.

+1

Если вы собираетесь копировать код, вы также должны указать источник - http://msdn.microsoft.com/en-us/library/zkwh89ks(v=vs.71).aspx –

+0

Хорошо. Я редактирую эту часть, поскольку забыл сделать это раньше .. Извините .. –