dポイントプレゼントキャンペーン実施中!

CとC++の両方で質問です。
5行目は無視される仕様ですか?
1 #include <windows.h>
2 void xx(){
3 int i;
4 }
5 void xx();
6 int main(

A 回答 (16件中1~10件)

例として挙げているものについては、単なる関数の宣言なので呼び出すことはできません(なお、C++ではプロトタイプですが、Cではこれはプロトタイプではありません)。



さて、ブロックの外で関数を呼び出す方法ですが、非局所オブジェクトの初期化子としてであれば可能です。例えば、

#include <cmath>
doble y = std::sqrt(2.0);
int main()
{
 ...
}

のようにです。
Cでは、標準的な方法はないと思います。
    • good
    • 0
この回答へのお礼

それは盲点でした。
intを返すxx()に変更したらできました。
void xx();がプロトタイプなら、それはmain()以前は普通は無理で
何か値を返すなら、変数初期化の右辺で関数を呼べるということですね。

お礼日時:2007/08/24 12:00

> コンパイルエラーでしたが、



すでに指摘されていますが、括弧が必要ですね。
    • good
    • 0

なーんだ。

この人、「変数のアドレスの値 」を質問してる人と同じ人か。。^^;

この回答への補足

たぶん同じ人だけど何か?

ANo.2にいい回答があったけど見逃してました。
gccが得意そうでmanespaceもよく知ってそうだから聞いてみたいんだけど
#include <iostream.h>ではなくて#include <iostream>ではうまくいきませんでした。
えらい人は.hを書かないみたいなので#include <iostream>でコンパイルしたいのですがどう直せばよいのですか?
#include <iostream.h>
void xx(){
 cout << "hey A()\n";
 fflush(stdout);
}
struct A
{
 A(){
  xx();
  fflush(stdout);
 }
};
A a;
int main(){
 cout << "hey main()\n";
 fflush(stdout);
}

補足日時:2007/08/24 13:50
    • good
    • 0

int dammy = (xx(), 0); ならいいかもしれないけど。

    • good
    • 0

> int dammy = xx(), 0; とでもしておけば、返却型がvoidのままでも



それは、コンパイラによるでしょうね。エラーにするコンパイラもあるでしょう。
    • good
    • 0

> intを返すxx()に変更したらできました。



そんなことをしなくても、例えば、

int dammy = xx(), 0;

とでもしておけば、返却型がvoidのままでも呼び出せます。
    • good
    • 0
この回答へのお礼

コンパイルエラーでしたが、リンカがどうだとかできもしないものとは違って
カンマ演算子を使うなんて柔軟で面白い発想ですね。

お礼日時:2007/08/24 12:57

>ブロックの外で関数をコールできないか


言葉通りなら、不可能でしょう。
#6さんが書かれている通り、エントリを変更することは可能でしょうが、
関数ブロック外の識別子名は、定義または宣言である必要があり
ますし、プリプロセスはコンパイル時置換されるので、
関数呼び出しを記述することは可能だが呼び出しを行っている
訳ではないので。。。

>void xx();
ここでなにが行われているのか理解していますか?
これは関数呼び出しを行っているわけではありませんよ?
    • good
    • 0
この回答へのお礼

ありがとうございます。
それがプロトタイプ宣言になることはもう理解できました。

お礼日時:2007/08/24 12:50

あぁ、ただし、main() を定義しているソースファイルと同じソースファイルに初期化の書いておかないと、動的リンクなんかある処理系だと、main() 実行後になるかもしれませんけど。

    • good
    • 0

「コンパイル時じゃなく、実行時に自分で書いたmain()内のコードよりも先に関数を呼び出したい」という意味なら、jacta さんが書かれているとおり、void xx(); じゃなく int xx(); とかにして、なんか不用な


int オブジェクトでも初期化しとけばいいですよ、C++なら。

int xx() { int i; return 0; }
int hoge = xx();
int main() {}
    • good
    • 0

「main()以前に関数を実行するつもりのソースを書いたら


実行ファイルすら作れなかったということですよ。」ですか。。。そりゃまぁ、コンパイルエラーですから^^;

リンカとは。。ですか^^; 変わったことをやろうとしてるなら、
コンピュータの動く仕組みとか、プログラムの動く仕組みとか、
OS や コンパイラ・リンカなどをしっかり理解してから
挑戦することをお勧めします。
    • good
    • 0

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