• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C:旧形式の宣言について)

旧形式の宣言について

このQ&Aのポイント
  • 旧形式の関数宣言を修正する必要があります。コンパイラの警告を回避するために新形式に変換したい。
  • 旧形式の関数宣言において、戻り値の型が省略されているため、どのように決定されるか疑問が生じています。
  • 実務でまさかこんな問題が出てくるとは思わなかった。

質問者が選んだベストアンサー

  • ベストアンサー
  • techa
  • ベストアンサー率60% (41/68)
回答No.1

引数も戻り値も宣言がなければintと仮定されるものだったと記憶しています。 つまり、あなたの例でいえば、paramも宣言がなければintと仮定されますし、関数の戻り値もintです。

nullreference
質問者

お礼

ありがとうございます。 引数の型指定も省けるとは知りませんでした。 私の探し方が悪いのか、 WEBではなかなか解説が見つからず困っておりました。 ありがとうございました。 (しかし、returnさがしてvoid|intに振り分けるの大変だなぁ・・・)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語の基本的な質問ですが、関数へのポインタの宣言

    関数へのポインタの質問です。 下のように、関数へのポインタを使ったプログラムを書きました。 (関数へのポインタを理解するためのものなので、実用的な意味はありません。(*^_^*) また、このプログラムはコンパイルもリンクも実行も問題なく出来ます。) #include <stdio.h> int add_func(int,int); (*func_p0) (int,int); int main(void) { int (*func_p1) (int,int); int (*func_p2) ( ); int hoge0,hoge1,hoge2; func_p0=add_func; hoge0=func_p0(3,5); printf("0 : 3+5は%d\n",hoge0); func_p1=add_func; hoge1=func_p1(3,5); printf("1 : 3+5は%d\n",hoge1); func_p2=add_func; hoge2=func_p2(3,5); printf("2 : 3+5は%d\n",hoge2); return(0); } int add_func(int x, int y) { return(x+y); } func_p0のように戻り値の型を書かない場合と、func_p1やfunc_p2のように戻り値の型を書くのとでは何が違うのでしょうか。 func_p0は外部変数ですが、自動変数にする(main関数の中で同様に宣言。)とコンパイルエラーになります。 それはなぜですか。 func_p1のように引数の型が書いてあるのと、func_p2のように引数の型が書いていないのでは何が違うのでしょうか。 int (*func_p2) ( );というのは、int (*func_p2) (void);とは違うんですよね?

  • 関数原型宣言について

    関数原型宣言について 下記のプログラムのfunc関数は、関数原型宣言 <func(int a, long b, char *c);>が述されていないのにfunc関数の仮引数の型longは、関数原型宣言が与えられるといると本に書かれていたのですが、何故でしょうか教えて頂きたい。 ******************************************** #include <stdio.h> /*--- 三つの引数を受け取る関数 ---*/ void func(int a, long b, char *c) { int x; long y; /* … */ } int main(int argc, char *argv[]) { int a = 1; char s[] = "abc"; func(a + 3, 2, s); return (0); } *************************************************************

  • C言語の関数の質問です

    C言語の質問です 最近C言語を始めました。以下の問題がわかりません。 int型の数値を入力して結果をdouble型の戻り値を返すことはできないのか。 関数の値のやり取りでも暗黙の型変換や明示的な型変換はできるのか。 #include <stdio.h> double square(int x); int main(void) { int num;   double ret;   scanf("%d",num); ret = square(num);    printf("%ld",ret); return(0); } double square(int x){ return(x*x); }

  • 不透明なデータのポインタ宣言

    ライブラリ内で使用し、ライブラリの外には、 中身を公開したくない構造体があります。 ライブラリ関数には必ず、ポインタとしてやりとりされます。 これを外部向けに不透明なデータのポインタとして宣言したいのですが・・ typedef const void *PRIVATE_DATA ; このように宣言してみたのですが、 これでは、否応にもvoidポインタとなってしまい、 char *等と暗黙のキャストが行われてしまいます。 たとえば・・ int lib_func( PRIVATE_DATA priv ) ; こんなライブラリ関数に対して、 lib_func( "HELLO" ) ; こんなおかしな呼び出し方が書けてしまいます。 不透明で、他の型へ暗黙のキャストが行われないポインタの宣言の仕方って、 ありませんでしょうか。。? ちなみに、コンパイラは gcc version 3.4.4 です。

  • C言語での関数形式マクロの使い方

    前の質問No.300834(関数形式マクロと空白の質問)と関連します。 関数形式マクロで、引数として入れるものは、変数でなくて型名でも構わないのでしょうか。 例えば、 #define mymul(t,x,y) ((t)(x)*(t)(y)) と定義すると、 mymul(int, 5.0, 3.5) と呼び出すと、 ((int)(5.0)*(int)(3.5)) に置き換える、 (intでキャストした 5.0 と、intでキャストした 3.5 をかける) というのは可能でしょうか。 あと、関数形式マクロの呼び出しは、実行部分でなくてもよいのでしょうか。関数頭部(関数の本体の前の部分)で呼び出せますか。 例えば #define ARGUMENT3(t1,v1,t2,v2,t3,v3) ¥ (t1 v1, t2 v2, t3 v3) #define a_func b_func ARGUMENT3 と定義しておいて、 関数を定義するときに、 int a_func(int,x, char*,cp, int**,ypp) { ・・・・ } こんなことをすると、 int b_func(int x, char *cp, int **ypp) { ・・・・ } に置き換わりますか? もし、ARGUMENT3の定義を、ARGUMENT3の後の括弧の中のカンマのつけ方を変えて、 #define ARGUMENT3(t1 v1,t2 v2,t3 v3) ¥ (t1 v1, t2 v2, t3 v3) とし、 int a_func(int x, char* cp, int** ypp) { ・・・・ } こうすると、先ほどのようなb_funcの関数頭部に変換することは出来ませんか? (関数形式マクロでこのような空白の入れ方をしてよいのでしょうか。)

  • 関数のプロトタイプ宣言

    #include <stdio.h> #define N 3 #define M 4 int sum(int [][M]); (関数のプロトタイプ宣言) int main(){   ・   ・   ・ return(0); } int sum(int x[][M]){    ・    ・ } 以上のプログラムより、関数のプロトタイプ宣言や、関数内の 行列の定義でint sum(int [][M]);や int sum(x[][M]){}となっていますが なぜ、列にMだけを代入することだけでよいのでしょうか? また、教科書に関数のプロトタイプ宣言ではint sum(int [][]);だけでもよいと書かれていたのですが 実際、コンパイルしてみたところ 'int[]' 型のサイズは未知あるいはゼロとエラーがでました。 これは、コンパイラによってできるものとできないものがあるのでしょうか?? よろしくお願いします。

  • CおよびC++におけるtypedefの厳密な扱われ方

    お世話になっております。 主に3D系のゲームプログラマをしている者です。 今更こんな基本的な事を聞くのもお恥ずかしいのですが、出来るだけ正確な確認をしたいので、 皆様のお力を借りれたらと思います。 知りたい部分は、typedefで型再定義された物は、 元の型と全く同じ型として扱われると思って問題ないのか。 と言う事です。 typedefは、型の同義語を作る。 とあり、型名を簡略化する目的で使用されるのが一般的な使われ方ですが、型の同義語。 と言うのは、完全に、同じ型ではあるが名前だけが違う。と言う別名定義(defineの如く)として 見て良いのでしょうか? 例えば、 typedef int INT_A; void func (int param); /* 通常のintで仮引数を取る */ int main(void) {  INT_A num = 0; /* 再定義したINT_Aで変数を宣言し */  func(num); /* 通常intの仮引数にINT_Aで引数を渡す */  return 0; } 等とした場合、問題ないでしょうか。 特に問題ない事は幾つかの処理系で確認していますし、自身問題ないだろうと思っていますが、 厳密に言えば推測の域を出ないので困っています。 参考書やネット、経験からの勝手な推測では、defineならプリプロセッサにより、 コンパイル前にテキストレベルでの置き換えが行われるので同一。 typedefはコンパイル時解釈とあるので、同じ型と解釈して、 オブジェクトファイル等のバイナリレベルに落とす際に同一物にしてしまう。 等の変換を処理系で行っているのなら、同一なのかな。等と思っています。 (私は処理系の開発等はした事がありませんし、知識もソフ開レベル程度があるだけです) また、上記コードはC/C++どちらでも適用出来ますが、 C++はCと比べ、型の違いをより厳密に見ると聞きます。 ネットや参考書、経験則と言った類からの意見ですと質問した意味が ありませんので、 なるべくなら、X3010および、X3014(ANSIやISOも可)の規格から見て、上記の様な コードが全く問題ないのかどうか、ご教示頂けると幸いです。 (私は規格を持っていませんので・・・) また、上の例はサンプルであり、使い方等におけるコードの 可読性や意義に関しては、ここでは別問題とします。 以上、宜しくお願いします。

  • DLL VBとC++

    VBAからVC++2005のDLLを呼び出すプログラムを書いています。 VB側で作成したcpp_proc関数を呼ぶとVBアプリ自体が落ちました。 DLLのreturnの直前に以下のMessageBoxで表示させるとそこまでは表示され、 リターンを押すと、落ちました。 VB側の引数の値 String * 8192が悪いのでしょうか? return直前まで動作していたので、DLLの戻り値に何か原因があるのでしょうか? ついでの質問ですが、DEFの @1は無くても動くのでしょうか? 意味が知りたいです。 // ----- C++ (DLL側) ----- int __stdcall cpp_proc(LPCSTR inp, LPSTR out) { ... 省略 MessageBox(0, "ここまで通過", "debug", MB_OK); return 0; } // ----- DEF ----- LIBRARY "example" DESCRIPTION 'テスト' EXPORTS ; 明示的なエクスポートはここへ記述できます cpp_proc @1 '----- VB側 ----- Public Declare Function cpp_proc Lib "example.dll" _ (ByVal inp As String, ByRef out As String) As Integer Public Sub Test() Dim ret As Integer Dim inp As String Dim out As String * 8192 ret = cpp_proc(inp, out) MsgBox("ret=[" & Cstr(ret) & "]"); End Sub

  • new型の戻り値? new型のパラメータ?

    あらゆる応用が利くC++ではあるのですが、それによってひとつのやり方にも複数の方法が出てくるのはよくあること。そこで、new型のポインタにおいて戻り値として返せばいいのか、パラメータとして使えばいいのか悩んでおります。 [1] wchar_t *XXX(int size){   wchar_t *ret = new wchar_t[size]   //ポインタに対するいろいろな制御   return ret; } ↑このように、関数内部でnew型ポインタを宣言し、そのポインタのアドレスを外部のポインタに渡す。 [2] static wchar_t ret = new wchar_t; -------- void XXX(wchar_t *ret, int size){   //ポインタに対するいろいろな制御 } ↑関数を呼ぶ手前ですでにnew型ポインタを宣言しておく [1]のほうが、宣言をする手間を省くことができるような気がしますが、new型ポインタがいらなくなったときにdeleteするのをわすれてしまったりということが起きるかもしれないということも考えてしまい、どちらをがメジャーなのかよくわかりません。 皆様ならどういった方法をとりますか? また別な方法がありましたが教えてくださるとありがたいです。

  • 16進数のマスク処理

    C#勉強中です。 以下のようなコードを書いてコンパイルをかけたところ、「型 'uint' を 'int' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください) 」と出ました。この理由がわかりません。 0xFFFF00FFはなぜ符合なしとなってunsigned扱いになるのでしょうか。 [Code] int ret = 0; ret &= 0xFFFF00FF;