bool SomeFunction()
{
}
私のマシンでは Borland C++ を実行できませんが、C++ から VB に変換する必要があるため、この機能について助けが必要です。
bool SomeFunction()
{
}
私のマシンでは Borland C++ を実行できませんが、C++ から VB に変換する必要があるため、この機能について助けが必要です。
関数は a を返すと主張していますが、bool
何も返しません。これにより、コンパイラの警告が発生するはずです。関数を呼び出す何かに割り当てるために使用すると、結果は未定義の動作になります。
bool b = SomeFunction(); // UB, SomeFunction is failing to return.
SomeFunction(); // still undefined behaviour
Onlymain()
は明示的に返さないことが許可され、その場合は暗黙的に を返します0
。
ここを参照してください:
§6.6.3/2:
関数の最後を流れることは、値を持たない戻りと同じです。これにより、値を返す関数で未定義の動作が発生します。
Borland XE2 で次のコードをコンパイルしました。
bool SomeFunction()
{
}
int main()
{
bool x = SomeFunction();
// ...
}
SomeFunction()
次の x86 アセンブラー コードに変換されます。
push ebp
mov ebp,esp
pop ebp
ret
割り当ては次のようにmain()
翻訳されます。
call SomeFunction()
mov [ebp-$31],al
の場所[ebp-$31]
はどこですかx
。つまり、 register の内容は にal
なりbool x
ます。al
0 の場合はx
false になり、それ以外の場合x
は true になります。私のシステムでは、これは常に当てはまりましたが、これはコンテキストによって異なります。また、デバッグとリリースで異なる結果が得られる場合があります。
結論は、もちろん、x は未定義です。与えられたコードは、書くのと少し似ています
bool x;
if (x)
{
// ...
}
SomeFunction()
の定義は、コンパイラの警告だけでなく、エラーも発生させるべきだと考える傾向があります。Visual C++ はそうしていますが、他のコンパイラについては知りません。
return true;
または_ return false;
bool SomeFunction()
{
return true;
// or
return false;
}
コンパイラに bool が組み込まれていない場合は、次のようにすることができます。
typedef int bool;
#define true 1
#define false 0
int main(void)
{
bool answer;
answer = true;
while(true)
{
}
return 0;
}