操作系统标识宏

查看gcc所定义的宏的命令:cpp -dM /dev/null
命令一: cpp -dM /dev/null
命令二: gcc -dM -E - < /dev/null
1:OS MACRO:
  WINDOWS: _WIN32、WIN32;
  UNIX/LINUX: unix、__unix、__unix__;
  SunOS/SOLARIS: __SVR4、__svr4__、sun、__sun、__sun__、sparc、__sparc、__sparc__;
  HPUX: __hppa、__hppa__、__hpux、__hpux__、_HPUX_SOURCE;
  AIX: _AIX、_AIX32、_AIX41、_AIX43、_AIX51、_AIX52;
  LINUX: linux、__linux、__linux__、__gnu_linux__;
  CPU: __x86_64、__x86_64__(Intel); __amd64、__amd64__(AMD); sparc、__sparc、__sparc__(Sun-SPARC);
2:Compiler MACRO:
  __STDC__: ANSI C标志,值为1,说明兼容ANSI C标准;
  __GNUC__: 它是gcc编译器编译代码时预定义的一个宏;需要针对gcc编写代码时,可以使用这个宏进行条件编译;__GNUC__的值表示gcc的版本号,需要针对特定版本的gcc编写代码时,也可以使用这个宏进行条件编译;__GNUC__的类型是int;
  __GNUC_MINOR__: gcc的次版本号;
  __GNUC_PATCHLEVEL__: gcc的修订号; 比如:gcc3.4.6版本,则__GNUC__=3;__GNUC_MINOR__=4;__GNUC_PATCHLEVEL__=6;
  __GLIBC__: glib的主版本号;
  __GLIBC_MINOR__: glib的次版本号;
3:常量宏:
  __PRETTY_FUNCTION__: 记录当前函数的函数头信息;
  __FUNCTION__: 仅记录当前函数名;
  __VA_ARGS__: 保存了可变参数列表"...";
4.C/C++原文件扩展名:
  .C:用C语言编写的源代码文件;
  .CPP/.CXX:用C++语言编写的源代码文件;
  .H/.HPP/.HXX:用C/C++语言编写的头文件;
5.main函数的四种写法:
  int main(void)
  int main(int argc)
  int main(int argc, char** argv)
  int main(int argc, char** argv, char** env)
6.VC++的版本号宏:
Visual Studio 5.0  --> VC++5.0 _MSC_VER = 1100
Visual Studio 6.0  --> VC++6.0 _MSC_VER = 1200
Visual Studio 2002 --> VC++7.0 _MSC_VER = 1300
Visual Studio 2003 --> VC++7.1 _MSC_VER = 1310
Visual Studio 2005 --> VC++8.0 _MSC_VER = 1400
Visual Studio 2008 --> VC++9.0 _MSC_VER = 1500

 

FROM: http://bdxnote.blog.163.com/blog/static/84442352010023104231179/

### Linux 操作系统中的定义及其使用 #### 系统调用编号枚举 在 `inc/syscall.h` 文件中,通过枚举的方式定义了一系列用于标识不同系统调用操作的常量。这些数值作为参数传递给底层的操作系统接口来执行特定的功能。 ```c enum { SYS_cputs = 0, SYS_cgetc, SYS_getenvid, SYS_env_destroy, NSYSCALLS }; ``` 此段代码展示了几个常见的系统调用名称与其对应的整型值之间的映射关系[^1]。 #### 地址转换定义 为了方便处理虚拟地址到物理页框索引间的变换,在头文件 `inc/mmu.h` 中提供了两个重要的定义——PDX 和 PTX。这两个分别用来计算线性地址所在的页面目录项(PD)以及页面表项(PT)的位置: ```c #define PDX(la) ((((uintptr_t)(la)) >> PDXSHIFT) & 0x3FF) #define PTX(la) ((((uintptr_t)(la)) >> PTXSHIFT) & 0x3FF) ``` 这里利用位运算实现了快速定位逻辑地址所属的具体层次结构节点[^2]。 #### 内存分配控制块释放机制 当应用程序不再需要某片已分配出去的动态内存区域时,则可以通过自定义的数据结构如 `struct mem_control_block` 来追踪并标记该部分空间的状态变化情况。下面是一个简单的例子说明如何安全地归还之前申请过的堆区片段至空闲池供后续重用: ```c void free(void* firstbyte){ struct mem_control_block* mcb; // 向前回溯找到关联的记忆管理单元描述符对象实例 mcb = (struct mem_control_block*)((char*)firstbyte - sizeof(*mcb)); // 更新成员变量表明当前实体处于可再分配状态 mcb->is_available = true; } ``` 上述方法假设每个实际使用的缓冲区内都隐含着一个额外的小头部记录其元数据信息以便于管理和维护[^3]。 #### 错误报告辅助工具perror() C标准库函数 `perror()` 可帮助开发者更便捷地输出错误消息字符串表示形式。它会依据全局 errno 的最新取值自动查找相应的解释文本,并打印出来便于调试诊断程序运行期间遇到的各种异常状况[^4]: ```c #include <stdio.h> #include <errno.h> int main(){ FILE *fp; fp=fopen("nonexistentfile.txt","r"); if(fp==NULL){ perror("File opening failed"); return(-1); } fclose(fp); return(0); } ``` 这段示范性的源码片段尝试打开不存在的目标文档;一旦失败就会触发条件分支内的语句序列,最终显示出具体的提示文字告知用户具体原因所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值