Maison > Article > développement back-end > C Récapitulatif des points clés 2 – Fonction
Une fonction en ligne
C Pourquoi avons-nous besoin de fonctions en ligne ? Que sont les fonctions en ligne ?
Nous savons déjà que nous pouvons utiliser const au lieu de la définition d'une macro pour une constante, comme const int A=3; #define A 3
Donc, pour une fonction, une telle macro peut-elle être atteint ? effet de remplacement.
Veuillez consulter :
#define MYFUNC(a, b) ((a) < (b) ? (a) :(b)) // 宏替换的表示 inline int myfunc(int a, int b) //函数表示 { returna < b ? a : b; }
Il s'agit d'une fonction en ligne. Notez les instructions
Remarque 1 :
doit être inline int myfunc(int a, int b) et l'implémentation du corps de la fonction, écrites ensemble
Note 2
Le compilateur C peut compiler une fonction en ligne
La fonction compilée en ligne par le compilateur C est appelée une fonction en ligne
Les fonctions en ligne ne sont pas définies dans le code final généré
Le compilateur C insère directement le corps de la fonction à l'endroit où la fonction est appelée
Les fonctions en ligne n'ont pas de fonctions ordinaires Extra surcharge lors de l'appel (push, jump, return) - valeur d'existence
Remarque 3 : le compilateur C n'autorise pas nécessairement l'inclusion de requêtes de fonctions !
Explication 4
La fonction en ligne est une fonction spéciale qui présente les caractéristiques des fonctions ordinaires (vérification des paramètres, type de retour, etc.)
La fonction en ligne est une fonction spéciale pour le compilateur Une requête, donc le compilateur peut rejeter cette requête
Les fonctions en ligne sont traitées par le compilateur et le corps de la fonction compilé est directement inséré dans le lieu appelant
Les extraits de code macro sont prétraités Processeur , simple remplacement de texte, sans aucun processus de compilation
Remarque 5 :
Le compilateur C moderne peut effectuer une optimisation de la compilation, donc certaines fonctions, même sans déclaration en ligne, peuvent également être compilées en ligne par le compilateur
De plus, certains compilateurs C modernes fournissent une syntaxe étendue qui peut forcer l'intégration des fonctions
Par exemple : __attribute__((always_inline) in g )) Attribut
Note 6 :
Limitations de la compilation en ligne en C :
ne peut contenir aucune forme d'instruction de boucle
Il ne peut pas y avoir trop de jugement conditionnel déclarations
Le corps de la fonction ne peut pas être trop grand
L'adresse de la fonction ne peut pas être exécutée
La déclaration en ligne de la fonction doit être avant l'instruction appelante
Les restrictions du compilateur sur les fonctions en ligne ne sont pas absolues. L'avantage des fonctions en ligne par rapport aux fonctions ordinaires est qu'elles évitent la surcharge liée au déplacement de la pile, au saut et au retour lorsque la fonction est appelée.
Par conséquent, lorsque la surcharge d'exécution du corps de la fonction est bien supérieure à la surcharge de poussée de la pile, de saut et de retour, alors l'inline n'aura aucun sens.
Conclusion :
1) Les fonctions en ligne insèrent directement le corps de la fonction à l'endroit où la fonction est appelée lors de la compilation
2) les fonctions en ligne sont simplement une requête, le compilateur peut ne pas nécessairement autoriser cette requête
3) Les fonctions en ligne évitent la surcharge de poussée de la pile, de saut et de retour lors de l'appel de fonctions ordinaires
Deux fonctions Paramètres par défaut
C peut fournir une valeur par défaut pour le paramètre lorsque la fonction est déclarée (vous devez m'appeler en fonction de la valeur que je vous fournis)
La valeur de ce paramètre n'est pas précisée lorsque la fonction est appelée, le compilateur remplacera automatiquement
void myPrint(int x = 3) { printf("x:%d", x); }
Règles pour les paramètres par défaut de la fonction
Seuls les paramètres à la fin de la liste des paramètres peuvent fournir un paramètre par défaut valeurs
Une fois que vous commencez à utiliser les valeurs de paramètre par défaut dans un appel de fonction, tous les paramètres après ce paramètre doivent utiliser les valeurs de paramètre par défaut
void printAB(int x = 3) { printf("x:%d\n",x); }
Dans le paramètre par défaut règle, si les paramètres par défaut apparaissent, alors ceux de droite doivent avoir des paramètres par défaut
void printABC(int a, int b, int x = 3, inty=4, int z = 5) { printf("x:%d\n",x); } int main62(int argc, char *argv[]) { printAB(2); printAB(); system("pause"); return0; }
3. Paramètres d'espace réservé de fonction (premier à occuper une fosse)
Les paramètres d'espace réservé n'ont qu'une déclaration de types de paramètres sans déclaration de nom de paramètre
Généralement, les paramètres d'espace réservé ne peuvent pas être utilisés dans le corps de la fonction
int func(int a, int b, int ) { returna + b; } int main01() { //func(1, 2); //可以吗?错误 printf("func(1,2, 3) = %d\n", func(1, 2, 3)); getchar(); return0; }
4. Paramètres par défaut et paramètres d'espace réservé (Combinaison)
peut être utilisé en combinaison avec des paramètres d'espace réservé et des paramètres par défaut. Importance : Laissez des indices pour l’expansion future du programme. Compatible avec les méthodes d'écriture irrégulières pouvant apparaître dans les programmes en langage C
int func2(int a, int b, int = 0) { return a + b; } void main() { //如果默认参数和占位参数在一起,都能调用起来 func2(1,2); func2(1,2, 3); system("pause"); }
结论://如果默认参数和占位参数在一起,都能调用起来
五.函数重载(重点)
1 )函数重载概念
函数重载(FunctionOverload)
用同一个函数名定义不同的函数
当函数名和不同的参数搭配时函数的含义不同
2 )函数重载的判断标准
函数重载至少满足下面的一个条件:
参数个数不同
参数类型不同
参数顺序不同
3 )函数返回值不是函数重载的判断标准
4)编译器调用重载函数的准则
将所有同名函数作为候选者
尝试寻找可行的候选函数
精确匹配实参
通过默认参数能够匹配实参
通过默认类型转换匹配实参
匹配失败
最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
无法匹配所有候选者,函数未定义,编译失败。
5)函数重载的注意事项
重载函数在本质上是相互独立的不同函数(静态链编)
重载函数的函数类型是不同的
函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的。
六. 函数重载与函数指针的结合
函数重载与函数指针
当使用重载函数名对函数指针进行赋值时
根据重载规则挑选与函数指针参数列表一致的候选者
严格匹配候选者的函数类型与函数指针的函数类型
//函数指针 基础的语法
//1声明一个函数类型
typedef void (myTypeFunc)(int a,int b) ; //int
//myTypeFunc *myfuncp = NULL; //定义一个函数指针 这个指针指向函数的入口地址
//声明一个函数指针类型
typedef void (*myPTypeFunc)(int a,int b) ; //声明了一个指针的数据类型
//myPTypeFunc fp = NULL; //通过 函数指针类型 定义了 一个函数指针 ,
//定义一个函数指针 变量
void (*myVarPFunc)(int a, int b);
//
待补充!
以上就是C++复习要点总结之二——函数的内容,更多相关内容请关注PHP中文网(www.php.cn)!