2016-08-27 8 views
-1

いくつかのレガシーCコードをC++に変換しています。エラーC2660:関数がX引数を取らない

ヘッダ・ファイルは、マクロP私の場合USE_ANSI_PROTOTYPESが定義されていないと評価において

#ifndef P 
# ifdef __STDC__ 
# ifndef __HIGHC__ 
# define USE_ANSI_PROTOTYPES 
# endif 
# endif 
# ifdef __sgi__ 
# define USE_ANSI_PROTOTYPES 
# endif 

# ifdef USE_ANSI_PROTOTYPES 
# define P(s) s 
# else 
# define P(s)() 
# endif 
#endif 

を含有します。

別のヘッダーファイルは、関数宣言でマクロPを使用します。 'long2str':

extern void long2str P((unsigned char *str,int pos,long clong)); 

関数は、関数が

エラーC2660と呼ばれているライン上

long2str(tmp_str, 0, seg_used(seg)); // <= error on this line 

しかしVS2012フラグエラーのようなコード内の特定の場所で呼び出される関数3つの引数を取らない

違う?

+0

'extern void long2str()(unsigned char * str、int pos、long clong)); 'どのように使用していますか? –

+2

@πάνταῥε 'あなたは' extern void long2str() 'に展開されないのでしょうか? – tkausl

+0

@tkauslはい、あなたは正しいです。 'extern void long2str P(???)(unsigned char * str、int pos、long clong)のように使うべきです);' –

答えて

4

80年代のCコンパイラを使用していない場合は、#ifdefの最初のブランチが作成されていることを確認する必要があります。

この場合、USE_ANSI_PROTOTYPESが定義されていない理由を確認してください。そして、それを定義するか#ifdefセクションを削除し、Pマクロを無条件に定義します。

__STDC__マクロは何らかの理由で定義されていません。https://msdn.microsoft.com/en-us/library/b0084kay.aspxを参照してください。

説明:戻る1980年に

(ANSI C89とISO C90の前に)、関数はこのように宣言された:

extern void long2str(); 

それだこと。パラメータ名もタイプもなく、関数名だけです(あなたが運が良ければ、戻り値の型)。

ISO C90は、関数プロトタイプを導入し、機能を宣言するの好ましい方法になった:それは、二重括弧内のパラメータで呼び出されたとき、あなたの質問から

extern void long2str (unsigned char *str,int pos,long clong); 

Pマクロは両方のバリアントを生成することができます。外側の括弧は単一のマクロ引数を形成し、内側の括弧はC90の場合にのみ必要です。

関連する問題