C/C++プログラミングにおけるいくつかの概念問題
1.次のコードに問題がありますか?
資料を調べるとptr=NULLの場合free()関数はメモリ解放をしないので、上記のプログラムはエラーが発生しません.printf("%s",ptr);VS 2008を利用してコンパイラが出力しているのは(null)で、他のコンパイラが何を出力しているのか分かりません.
2.変数の前の2つのコロン(:)
3.Win 32プラットフォーム下のマイクロソフトCコンパイラ(cl.exe for 80×86)の整列ポリシー:1)構造体変数のヘッダアドレスは、その最も広い基本タイプのメンバーのサイズによって除去することができる.2)構造体の各メンバーの構造体ヘッダアドレスに対するオフセット量(offset)はメンバーサイズの整数倍であり、必要に応じてコンパイラはメンバー間にパディングバイト(internal adding)を加える.3)構造体の合計サイズは、構造体の最も広い基本タイプのメンバーサイズの整数倍であり、必要に応じて、コンパイラは最後のメンバーの後にパディングバイト(trailing padding)を加算します.
出典:http://blog.csdn.net/hilyoo/article/details/4464448
4.sizeof(TestClassSize)の出力結果?
Sizeof(TestClassSize)の出力結果は8であり、ここでint t;4 byteを占める;虚関数の個数は、1つまたは複数にかかわらず4 byte(doubleタイプのデータが3で記述されている整列規則がある場合)のみを占め、虚関数は1つの虚関数テーブル(Virtual Table)によって実現されるため、ここでの4 byteは虚関数テーブルのポインタを格納する.
5.現在のソースファイルのファイル名とソースファイルの現在の行番号を印刷する
__FILE__および_LINE__システム定義マクロです.このマクロはファイルで定義されているのではなく、コンパイラによって定義されています.
6.プログラムがc++コンパイラによってコンパイルされたかどうかを判断する
char* ptr = NULL;
printf("%s
", ptr);
free(ptr);
資料を調べるとptr=NULLの場合free()関数はメモリ解放をしないので、上記のプログラムはエラーが発生しません.printf("%s",ptr);VS 2008を利用してコンパイラが出力しているのは(null)で、他のコンパイラが何を出力しているのか分かりません.
2.変数の前の2つのコロン(:)
int x = 5;
int main(int argc, char* argv[]){
int x = 3;
std::cout<<x<<' '<<::x<<std::endl;
}
が出力した結果は「3 5」であり、グローバル定義「int x=5;「x」:「`global namespace'」のメンバーではないと誤報されるので、感覚の2つのコロン::グローバル空間を表す.3.Win 32プラットフォーム下のマイクロソフトCコンパイラ(cl.exe for 80×86)の整列ポリシー:1)構造体変数のヘッダアドレスは、その最も広い基本タイプのメンバーのサイズによって除去することができる.2)構造体の各メンバーの構造体ヘッダアドレスに対するオフセット量(offset)はメンバーサイズの整数倍であり、必要に応じてコンパイラはメンバー間にパディングバイト(internal adding)を加える.3)構造体の合計サイズは、構造体の最も広い基本タイプのメンバーサイズの整数倍であり、必要に応じて、コンパイラは最後のメンバーの後にパディングバイト(trailing padding)を加算します.
出典:http://blog.csdn.net/hilyoo/article/details/4464448
4.sizeof(TestClassSize)の出力結果?
class TestClassSize{
public:
virtual void fun(void){cout<<"fun"<<endl;}
virtual void fun2(void){};
private:
int t;
};
Sizeof(TestClassSize)の出力結果は8であり、ここでint t;4 byteを占める;虚関数の個数は、1つまたは複数にかかわらず4 byte(doubleタイプのデータが3で記述されている整列規則がある場合)のみを占め、虚関数は1つの虚関数テーブル(Virtual Table)によって実現されるため、ここでの4 byteは虚関数テーブルのポインタを格納する.
5.現在のソースファイルのファイル名とソースファイルの現在の行番号を印刷する
cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__および_LINE__システム定義マクロです.このマクロはファイルで定義されているのではなく、コンパイラによって定義されています.
6.プログラムがc++コンパイラによってコンパイルされたかどうかを判断する
#ifdef __cplusplus
//doing something
#endif