牛客网C++刷题十三
为什么标准头文件都有类似以下的结构?
#ifndef __INCvxWorksh #define __INCvxWorksh #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __cplusplus } #endif #endif /* __INCvxWorksh */
参考答案:
头文件中的编译宏
#ifndef __INCvxWorksh #define __INCvxWorksh #endif
的作用是防止函数被重复引用。
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在symbol库中的名字与C语言的不同。例如,假设某个函数的原型为:
void foo(int x, int y);
该函数被C编译器编译后在symbol库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。
为了实现C和C++的混合编程,C++提供了C连接交换指定符号extern "C"来解决名字匹配问题,函数声明前加上extern "C"后,则编译器就会按照C语言的方式将该函数编译为_foo,C++函数可以调用c的函数了。
#endif就近原则
对条件编译(#ifdef,#else,#endif,#if等)进行说明。以下分3种情况:
1:情况1:
#ifdef _XXXX
…程序段1…
#else
…程序段2…
#endif
这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。
例:
#define NUM
…
…
…
#ifdef NUM
printf(“之前NUM有过定义啦!\n”);
#else
printf(“之前NUM没有过定义!\n”);
#endif
}
如果程序开头有#define NUM这行,即NUM有定义,碰到下面#ifdef NUM的时候,当然执行第一个printf。否则第二个printf将被执行。
我认为,用这种,可以很方便的开启/关闭整个程序的某项特定功能。
2:情况2:
#ifndef _XXXX
…程序段1…
#else
…程序段2…
#endif
这里使用了#ifndef,表示的是if not def。当然是和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)。例子就不举了。
3:情况3:
#if 常量
…程序段1…
#else
…程序段2…
#endif
这里表示,如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。
我认为,这种方法可以将测试代码加进来。当需要开启测试的时候,只要将常量变1就好了。而不要测试的时候,只要将常量变0。
- 点赞
- 收藏
- 分享
- 文章举报
- 【C++基础之十三】指向指针的指针
- open cv+C++错误及经验总结(十三)
- C++小题(十三)
- Effective C++ 学习笔记(十三)
- 设计模式的解析和实现(C++)之十三-FlyWeight模式
- 十三、c++模板基础
- C++后台开发面试总结(摘抄自牛客网)
- 2016年的C++常见的面试问题详解~搬至牛客网~2
- 2016年的C++常见的面试问题详解~搬至牛客网~3
- 读书笔记_Effective_C++_条款十三:以对象管理资源
- C++的基础知识(十三)--指针变量
- 牛客网C++刷题
- C++语言学习(十三)——C++对象模型分析
- C++学习笔记(十三):类、包和接口
- C++ 牛客网做题笔记【600题总结】
- 牛客网-华为在线编程004--C++字符串的分割
- C++ 牛客网做题笔记【200题总结】
- #我是小白之牛客网学习# C++面试题(自学整理阶段-转自牛客网)
- C++程序设计实验报告(十三)
- 牛客网( C/C++工程师能力评估)