注:のみ、私的使用の場合、主に「Ditaiソフトウェア・アカデミー」のブログノートからブログの内容。
テスト環境:Ubuntuの10.10
GCCのバージョン:4.4.5
まず、主な機能の概念
1)C言語の主機能は、呼び出された主な機能
2)からCプログラムのメイン関数が実行を開始します
正しい以下の主な機能の定義?
A:正しいです
B:右
C:右
D:右
编程实验
main函数的原型究竟是什么
33-1.c
int main()
{
return 0;
}
第二に、の性質の主な機能
1) 主な機能は、オペレーティングシステムコールの関数であります
常に2)オペレーティング・システムのメインとしての機能アプリケーションの始まり
3)OS メイン関数の戻り値としてプログラムの終了ステータス
思考:
なぜCのコンパイラがサポートする非常に多くの異なるメイン関数のプロトタイプ?
多くのコンパイラは、より柔軟なプログラミングに適応するために、プログラミングにより助長ようにするためには、コンパイラの最適化は、常に改善、商用競争に存在します。
编程实验
main函数的返回值
33-2-A.c
#include <stdio.h>
int main()
{
printf("I'm A!\n");
return 0;
}
操作:
1)GCC 33-2-Acは33-2-a.outの結果を印刷し、正しく構築され-o:
I'm A!
33-2-B.c
#include <stdio.h>
int main()
{
printf("I'm B!\n");
return 99;
}
操作:
1)GCC 33-2-BCは33-2-B.OUTは結果を印刷、正しく構築され-o:
I'm B!
2)メイン関数リターンをGCCで値を表示する方法。
命令:echo $?
显示:99
第三に、パラメータの主な機能
プログラムは、主な機能を実行する1)パラメータを渡すことができます
int main()
int main(int argc)
int main(int argc,char *argv[])
int main(int argc,char *argv[],char *env[])
argc-命令行参数个数
argv-命令行参数数组
env-环境变量数组
2)GCCコンパイラ一般的な使用法:
gcc a.c b.c c.c
argc ---> 4
argv[0] ---> gcc
argv[1] ---> a.c
argv[2] ---> b.c
argv[3] ---> c.c
实例分析
main函数的参数
33-3.c
#include <stdio.h>
int main(int argc, char* argv[], char* env[])
{
int i = 0;
printf("============== Begin argv ==============\n");
printf("argc = 1");
for(i=0; i<argc; i++)
{
printf("%s\n", argv[i]); //打印命令行参数
}
printf("============== End argv ==============\n");
printf("\n");
printf("\n");
printf("\n");
printf("============== Begin env ==============\n");
for(i=0; env[i]!=NULL; i++)
{
//printf("%s\n", env[i]);
}
printf("============== End env ==============\n");
return 0;
}
操作:
1)gccの33-3.c -o 33-3.outコンパイル正しく、結果を印刷します:
====== Begin argv ======
argc = 1
./33-3.out
====== End argv ======
======= Begin env ======
====== End env ======
分析:
コマンド:./ 33-3.outのargv [0] = "./33-3.out" ./ 33-3.out ==> ARGC = 1パラメータに
2)命令:./ 33-3.out交流BCのCC
====== Begin argv ======
argc = 4
./33-3.out
a.c
b.c
c.c
====== End argv ======
======= Begin env ======
====== End env ======
第四に、ヒント
小問1)インタビュー
主な機能は、機能プログラムDOの最初の実行でなければなりませんか?
必ずしもそうではありません。gccの下のキー属性があります。
__attribute__((constructor)):main函数之前执行
__attribute__((destructor)):main函数之后执行
实例分析
gcc中的属性关键字
33-4.c
#include <stdio.h>
#ifndef __GNUC__ //如果不是gcc编译器,就定义宏
#define __attribute__(x)
#endif
__attribute__((constructor)) // constructor给before_main函数一个属性,提示编译器运行main()先执行defore_main()
void before_main()
{
printf("%s\n",__FUNCTION__); //标准的c中__FUNCTION__代表函数名
}
__attribute__((destructor)) // destructor给after_main函数一个属性,提示编译器运行完main()函数后执行defore_main()
void after_main()
{
printf("%s\n",__FUNCTION__);
}
int main()
{
printf("%s\n",__FUNCTION__);
return 0;
}
操作:
1)gccの33-4.c -o 33-4.outコンパイル正しく、結果を印刷します:
before_main
main
after_main
要約:
1)からCプログラムのメイン関数が実行を開始します
2) 主な機能は、オペレーティング・システム関数呼び出し
3) 主機能は有しパラメータと戻り値を
4) 最近のコンパイラをサポートし、メイン関数の前に呼び出し、他の関数を(ライト・コードへのコンパイラに依存しないようにしよう!)