面试题答案
一键面试- 编写可移植代码的通用原则
- 使用条件编译:结合
#ifdef
、#ifndef
等预处理指令,根据不同的编译器或平台定义来有条件地使用#pragma
指令。 - 封装平台相关代码:将与特定平台或编译器相关的
#pragma
指令封装在单独的文件或函数中,这样主代码逻辑更清晰,也便于维护和移植。
- 使用条件编译:结合
- 处理特定编译器优化
- 示例:在处理不同编译器对循环优化的
#pragma
指令时。- GCC编译器:可以使用
#pragma GCC unroll
来指定循环展开。#ifdef __GNUC__ #pragma GCC unroll 4 #endif for(int i = 0; i < 100; i++){ // 循环体代码 }
- Visual Studio编译器:使用
#pragma loop(...)
指令,例如#pragma loop( unroll )
。#ifdef _MSC_VER #pragma loop( unroll ) #endif for(int i = 0; i < 100; i++){ // 循环体代码 }
- GCC编译器:可以使用
- 示例:在处理不同编译器对循环优化的
- 处理平台特性
- 示例:在处理不同平台下对齐方式的
#pragma
指令。- Linux平台(GCC编译器):
#pragma pack(n)
用于设置结构体对齐字节数为n
。#ifdef __GNUC__ #pragma pack(4) #endif struct MyStruct{ char a; int b; }; #ifdef __GNUC__ #pragma pack() // 恢复默认对齐 #endif
- Windows平台(Visual Studio编译器):
#pragma pack(push, n)
设置对齐并将当前对齐设置压入栈,#pragma pack(pop)
恢复之前的对齐设置。#ifdef _MSC_VER #pragma pack(push, 4) #endif struct MyStruct{ char a; int b; }; #ifdef _MSC_VER #pragma pack(pop) #endif
- Linux平台(GCC编译器):
- 示例:在处理不同平台下对齐方式的