---页首---

C++extern-C&const&pragma once

extern-C

  • extern "C" 修饰的代码会按照C语言的方式去编译

    extern "C" void func() {
    	cout << "func()" << endl;
    }
    extern "C" void func(int age) {
    	cout << "func(int age)" << age << endl;
    }
    
    extern "C" {
    	void func(){ }
    	void func(int age) { }
    }
    
  • 所以上面的编译不会通过,C语言没有函数重载
  • 如果函数同时有声明和实现, 要让函数声明被extern "C"修饰, 函数实现可以不修饰
    extern "C" void func();
    void func(){  }
    // 或者
    extern "C" {
    	void func();
    }
    void func() {  }
    
  • 由于C、C++编译规则的不同,在C、C++混合开发时,C++在调用C语言API时,需要使用extern "C"修饰C语言的函数声明
    extern "C" {
    	#include "xxx.h"
    }
    
  • 也可以在编写C语言代码中直接使用extern "C",这样就可以直接被C++调用
    // 通过使用宏__cplusplus来区分C、C++环境
    #ifdef __cplusplus
    extern "C" {
    #endif // __cplusplus
    int func1();
    int func2();
    #ifdef __cplusplus
    }
    #endif // __cplusplus
    

pragma once

  • 经常使用#ifdef、#define、#endif来防止头文件的内容被重复包含
  • #pragma once 可防止整个文件的内容被重复包含
  • 上面两个的区别
    • #ifdef、#define、#endif受C/C++标准支持,不受编译器的任何限制
    • 有些编译器不支持#pragma once(较老编译器不支持,如GCC 3.4版本之前),兼容性不够好
    • #ifdef、#define、#endif可以针对一个文件的部分代码,而#pragma once 只能针对整个文件

const

  • const是常量的意思,被其修饰的变量不可改变

  • 如果修饰的是类、结构体(的指针),其成员也不可更改

    int p = 10;
    const int *p0 = &p; // p0不是常量, *p0是常量
    int const *p1 = &p; // p1不是常量, *p1是常量
    int *const p2 = &p; // p2是常量, *p2不是常量
    const int *const p3 = &p; // p3是常量, *p3是常量
    int const * const p4 = &p; // p5是常量, *p5是常量
    // 总结:const 修饰的是其右边的内容
    
posted @ 2019-07-29 09:12  20190311  阅读(208)  评论(0编辑  收藏  举报
---页脚---