gccでprintfのように、任意の数の引数をとる関数を作りたいのですが、MS-VCでは
hoge(arg1, arg2, ...)
という書式のようですが、gccではエラーでした。
どうすればいいのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

 関数の定義自体は、stdarg.hをインクルードしなくても出来ますよ。


(可変長引数のプロトタイプは、ANSI C準拠の処理系ならば、どこでも使えるはずですが。)

 ちなみに下記のコードでテストしてみたところ、問題なく動作しました。
(gccのバージョンは2.95.2でした)

#include <stdio.h>

void arg(int n, ... );

int main(void)
{
  arg(5, 1,5,3,4,7);
  return 0;
}

void arg(int n, ... )
{
  int *p = &n;
  int i;

  for (i = 0; i < n; i++)
    printf("%d\n", *++p);
}

# 引数の渡され方が分かっていれば、stdarg.hがなくても処理できます。
    • good
    • 0
この回答へのお礼

うーむ、構文は間違ってないと思うのですが。
もういちど調べてみます。

お礼日時:2001/07/06 12:07

#include <stdio.h>


#include <stdarg.h>

int func(int, ...) ;

int main(void)
{
 func(1, "a") ;
 func(2, "a", "ab") ;
 func(3, "a", "ab", "abc") ;
 return (0) ;
}

int func(int num, ...)
{
 char *pp ;
 int cc ;
 va_list ll ;

 va_start(ll, num) ;
 for (cc = 0 ; cc < num ; cc++) {
  pp = va_arg(ll, char *) ;
  printf("%3d:\"%s\"\n", cc, pp) ;
 }
 va_end(ll) ;
 return (cc) ;
}

egcs2.91.57(CygWin32上)ではオッケーでした。
MSVC++でもstdargはサポートされています。

この回答への補足

stdarg.hをインクルードしなければ、関数の定義ができないのでしょうか?
使い方はとりあえずわかっているので。

補足日時:2001/07/02 15:50
    • good
    • 0

someFunction(LPSTR lpszFormat, ...)


とすれば使えるはずです。

使い方は、ご自分で探してください。
TRACEマクロなどをソースから探せば使い方が
分かると思いますよ。

ではでは☆

この回答への補足

それが、どうもそこ構文でエラーになってしまいます。
バージョンが低いのかな?

補足日時:2001/07/02 15:48
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語において、関数とその役割、また、引数とその役割、仮引数、実引数とは?

C言語初心者です。
そもそもPC使うのも苦手ですがよろしくお願いします。
C言語において、関数とその役割、また、引数とその役割、仮引数、実引数の役割を、実例を用いて簡潔に説明していただけると助かります。お願いします。

Aベストアンサー

そんなに一気に理解しようとしても難しいですね。
http://www.kyoto-su.ac.jp/~yamada/ap/parameter_argument.html
を眺めてみてください(仮引数と実引数の意味が書いてある。ただしC言語であんまり仮引数がとか実引数が、という言い方はしないような)。
C言語においては全ての処理のかたまりが「関数」です。関数は何かの処理を行って値を返すことも返さないこともあります。
ここの例でいうとf(int x)は値を返す関数、main()は返さない関数で、ここからプログラムの処理が始まります(そういうルールになっている)。
このページのプログラムはちょっと古い書き方なんで今だと警告が出る可能性があります。

Qなぜgccはstdio.hをインクルードしなくてもprintfが実行できるのか

なぜgccはstdio.hをインクルードしなくてもprintfが実行できるのでしょうか。

暗黙にインクルードされるヘッダと
されないヘッダファイルの差分等あれば教えていただきたく。。

// main.c
int main(){
printf("SWSW\n") ;
return 0 ;
}
% gcc main.c
% ./a.out
SWSW

Aベストアンサー

ごくおおざっぱに言えば、インクルードファイルの中には、

・グローバル変数
・typedef による型の定義
・sturcut や union や enum などユーザー定義の型(の定義)
・#define によるマクロ
・関数プロトタイプ
があります(その他のものもあります)

この中で、関数プロトタイプをのぞけば必須です。
ですから、NULL や EOF を使うには、(別に定義するのでなければ) stdio.h が必要です(だったかな?)

assert の実体は(関数ではなくて) #define によるマクロだった気がします(未確認・だとしたらインクルードは必須ですね)

さて、printf() の件ですが、これは、
printf("SWSW\n");
だったから(2番目以降の引数がないから)たまたま実行可能だったという可能性があります。
printf() は、可変引数(引数の数が決まっていない)関数なので、プロトタイプがないと、うまく処理できないコンパイラが多いです。
その場合でも、最初の引数の型決まっているので、引数がひとつだと、たまたま正常に実行可能です。
printf("%d, %f, %s", 1, 0.1, "STR");
なんかだとうまく処理できますでしょうか?
(これも未確認)

あと、関数の返値の型が int でないものは、プロトタイプがないと変な値が帰ってきます。
(ちなみに、printf() の返値は int です。あまり使われませんが)

ごくおおざっぱに言えば、インクルードファイルの中には、

・グローバル変数
・typedef による型の定義
・sturcut や union や enum などユーザー定義の型(の定義)
・#define によるマクロ
・関数プロトタイプ
があります(その他のものもあります)

この中で、関数プロトタイプをのぞけば必須です。
ですから、NULL や EOF を使うには、(別に定義するのでなければ) stdio.h が必要です(だったかな?)

assert の実体は(関数ではなくて) #define によるマクロだった気がします(未確認・だ...続きを読む

Qc言語 関数 変数 引数 とは何なのか

関数、変数、引数のそれぞれの機能と三つの関係性をわかりやすく教えてください

Aベストアンサー

数学の用語と同じです。
数学で言うと、
2x + y + 3 = 0
のような式で、x や y という文字が変数です。
y = f(x)
この f が関数で、x が引数(変数でもある)、y が関数の値(変数でもある)。

Cだと、
ch = getchar();
ch が変数、getchar が関数、この場合は引数は無し。

n = printf("%d",x);
printf が関数、"%d" が引数、x も引数、x はまた変数でもある。n も変数です。

Qprintfのように複数の引数をもつには?

不特定多数の引数を持つ関数は作れますか?
例えば

main(){
sum(1,2,3) //1+2+3で6になる
sum(1,2,3,4,5) //1+2+3+4+5で15になる
}

このようにsum()の中の引数の数を自由に変えて処理する内容も変わる関数はできないでしょうか

Aベストアンサー

「不特定多数の引数」を通常は「可変引数」や「可変個引数」と言います。
参照URLはc言語ですが、いかがでしょう?
http://www.geocities.jp/ky_webid/c/057.html

Q引数をつけたマクロ定義とは

引数つきマクロ宣言って、どういった場面で使うのでしょうか?

例えば

#define abc(a) a*a と定義している場合
x=abc(a) のabc(a)がa*aに変わる。

でも、こんなことしたら
abc(a)関数を呼び出せなくなるのでは?

要するに、「引数つきのマクロ定義が
ある理由などを、説明していただければと思います。

Aベストアンサー

マクロというのはコンパイルの時点で、「あらかじめ定義しておいた文字列に置換される」ということで、関数とは全く意味が違ってきます。

ご質問の、引数つきマクロについてですが、例えばこんなことをしたかったとします。

sprintf(abc->pqr, "%04d", 4);
strcpy(abc->xyz, "abc");
sprintf(def->pqr, "%04d", 5);
strcpy(def->xyz, "def");
sprintf(ghi->pqr, "%04d", 6);
strcpy(ghi->xyz, "ghi");


引数つきマクロでこんな風に書けます。

#define SCPY(XXX, YYY, ZZZ) \
sprintf(XXX->pqr, "%04d", YYY); \
strcpy(XXX->xyz, ZZZ)

SCPY(abc, 4, "abc");
SCPY(def, 5, "def");
SCPY(ghi, 6, "ghi");

3つの操作の異なる部分だけを記述するため、見やすくなったでしょう。見やすいソースというのはバグを少なくするコツでもありますので、上手に使って下さい。
マクロは置換されるだけなので、構造体名だろうが文字列だろうがOKです。

マクロというのはコンパイルの時点で、「あらかじめ定義しておいた文字列に置換される」ということで、関数とは全く意味が違ってきます。

ご質問の、引数つきマクロについてですが、例えばこんなことをしたかったとします。

sprintf(abc->pqr, "%04d", 4);
strcpy(abc->xyz, "abc");
sprintf(def->pqr, "%04d", 5);
strcpy(def->xyz, "def");
sprintf(ghi->pqr, "%04d", 6);
strcpy(ghi->xyz, "ghi");


引数つきマクロでこんな風に書けます。

#define SCPY(XXX, YYY, ZZZ) \
sprintf(...続きを読む

Qc++ , template , ファイル分割 , 助けてください...

//-----------------coord.h-------------
template <class type>
class coord
{
type v[3];
public:
coord(void);
void Show(void);
};
//-----------------main.cpp------------
#include<iostream>
#include"coord.h"
using namespace std;

int main(void)
{
coord<double> ob;

ob.Show();

return 0;
}
//----------------------coord.cpp-----------
#include<iostream>
#include"coord.h"
using namespace std;

template <class type>
coord<type>::coord(void)
{
v[0]=v[1]=v[2]=0;
}

template <class type>
void coord<type>::Show(void)
{
cout << "hello" << endl;
}

同一フォルダ内に上記のファイルが 3 つあります.
つまり上の 3 つのファイルを分割してコンパイルさせたいです.
この状態で...MS-DOSプロンプトからコンパイルします.

C:\test>bcc32 -c coord.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
coord.cpp:

C:\test>bcc32 -c main.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
main.cpp:

C:\test>bcc32 -emain main.obj coord.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル 'coord<double>::coord<double>()' が未解決(C:\USERS\TAITO\PR
OG\CPP\TEST\MAIN.OBJ が参照)
Error: 外部シンボル 'coord<double>::Show()' が未解決(C:\USERS\TAITO\PROG\CPP\TE
ST\MAIN.OBJ が参照)


すると, このようなエラー文が出てしまい
実行可能ファイルができません.

コンパイラはbccです.

原因が全く分かりません.

助けてください...





ちなみに,
分割せずにコンパイルすると通ります.

自分は c 言語での分割コンパイル経験はあるので
それをそのまま c++ 言語でも用いているのですが,
何か変えなければならないのでしょうか?

//-----------------coord.h-------------
template <class type>
class coord
{
type v[3];
public:
coord(void);
void Show(void);
};
//-----------------main.cpp------------
#include<iostream>
#include"coord.h"
using namespace std;

int main(void)
{
coord<double> ob;

ob.Show();

return 0;
}
//----------------------coord.cpp-----------
#include<iostream>
#include"coord.h"
using namespace std;

template <class type>
coord<type>::coord(void)
{
v[0]=v[...続きを読む

Aベストアンサー

> クラスの宣言はヘッダファイル上で全て行なわないといけないのですか?

違います。テンプレートだからです。
本来であれば、exportを使って移出を行えば、ほぼ最初のようにソース分割できるのですが、Borland C++ Compilerでは(Visual C++でもGCCでも)exportをサポートしていないので使えません。

QExcelの関数で引数を数える方法とは?

大学の情報の授業で、次のような課題が出題されました。

「Excelの関数で引数を数える方法について述べなさい」

意味がよくわからないので、誰かわかりやすく教えてください。

Aベストアンサー

Excelの関数で引数とは関数目に続いて()の中に入力されるもので、それぞれはカンマ(,)で区切られています。
例えばCOUNTIF関数はCOUNTIF(範囲,条件)のように使われますね。

A1セルからA10セルの間に10以上の数がいくつあるかを求めるのでしたらCOUNTIF(A1:A10,">=10")のような関数になり、引数の数は2、すなわちカンマの数に1をプラスした数になります。

引数を数える方法としては例えばこの関数をB1セルに文字列の形で入力するとして、次の式を使うことで求めることができるでしょう。

=LEN(ASC(B1)-LEN(SUBSTITUTE(ASC(B1),",",""))+1

QC言語(gcc), Linux, FTPプログラミング

C言語でFTPを使用してあるサーバからデータをダウンロードするプログラムを作りたいのですが、短期間で作らなければならない為、なるべく作り込みはしたくないのです。
FTPを扱うライブラリのようなものがあるのが一番ありがたいのですが、ご存じないでしょうか?
条件としては
・gccのバージョン3~4ぐらいで使えること。
・Solaris,RedHatなど主要なLinuxで使えること。
・ライセンスの制限がなるべく無いこと。
以上、よろしくお願いいたします。

Aベストアンサー

> FTPでアップロードは出来るという記述はあったのですが

私は逆にget出来る、の記述しか見つけられませんでした。
http://www.libcurl.org/ より:
> libcurl is a free, open source client to get documents/files from servers, using any of the supported protocols.

対応プロトコルの数を考えるとちとftp専用としてはサイズが大きそうな気はしますが、簡単に使えそうではありますね。

Q引数が無効とは

ドムで引数が無効ですというエラーなのですがどんなことが考えられますか。

Aベストアンサー

実際のコード見ないと一概に言えない。

Q【C++ TR1】tr1::tupleのコンストラクタについて

 こんばんは。今回初めて此方のカテゴリに質問させて頂きます。
 今暇つぶしにtr1::tuple<T1, T2, ..., TN>の中を書いています。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

--------------------------------------------------------------
pdfの[6.1.3]より(少し省略しています)
--------------------------------------------------------------
template<T1, T2, ..., TN>
class tuple
{
public:

↓このコンストラクタのP1~PNが、どの様な型に成るのかが不明瞭です。
explicit tuple(P1, P2, ..., PN);

--------------------------------------------------------------

pdfの[6.1.3.1]辺りにP1~PNの事について、書いてはあるのですが・・・今一掴めません。

例えば、

tr1::tuple<char, int, const char(&)[3]>

と書いた場合、コンストラクタのP1, P2, P3はどう言う型になるのでしょうか。
テンプレートメタプログラムが解る方、ご教示お願いします。

 こんばんは。今回初めて此方のカテゴリに質問させて頂きます。
 今暇つぶしにtr1::tuple<T1, T2, ..., TN>の中を書いています。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

--------------------------------------------------------------
pdfの[6.1.3]より(少し省略しています)
--------------------------------------------------------------
template<T1, T2, ..., TN>
class tuple
{
public:

↓このコンストラクタのP1~PNが、どの様な型に成るのかが不明瞭...続きを読む

Aベストアンサー

> where Pi is Ti if Ti is a reference type, or const Ti& otherwise.

なので、

tr1::tuple<char, int, const char(&)[3]>

の仮引数の型は、

const char&, const int&, const char(&)[3]

ではないでしょうか?


人気Q&Aランキング

おすすめ情報