C++标准库(预处理器)



1. 预处理器:
    1.1 使用#代表返回一个带引号的字符串,如:
     #define to_string(s)   #s
     to_string(hello);  可以表示成"hello"
    1.2 使用##代表连接前后的内容,如:
    #define concatenate( x, y ) x##y
    concatenate(5,2);可以表示成52
   1.3 #if, #ifdef, #ifndef, #else, #elif, #endif ,#if defined,!defined均可以
   1.4 #line
    #line命令用于更改__LINE__和__FILE__的值,而这两个值一般用于调试输出信息,如输出出错的行和文件信息
   如果使用默认的__LINE__,则直接取用即可,不用使用#line进行更改,如assert的实现中会使用这两个值,另外__FILE__取用的不是unicode类型,可以
  使用宏_CRT_WIDE(__FILE__)进行转换,宏_CRT_WIDE内部即在前面加了个L进行转换,也可以自己写宏,如:
  #define test2(_String) L ## _String
  #define test1(_String) test2(_String) 
  strShow.Format(L"the line is :%d, filename is: %s", __LINE__, test1(__FILE__));
  1.5 #pragma
      比较复杂,功能强大,如可以用于消除编译器警告:
 #pragma warning(disable:4507 34) // 不显示4507和34号警告信息
 #pragma warning(once:4385) // 4385号警告信息仅报告一次
 #pragma warning(error:164) // 把164号警告信息作为一个错误。
      另如:
      #pragma once 编译一次

#pragma warning(push)// 保存当前编译器警告级别。这样在下面设置了disable警告级别后,再在最下面恢复警告级别。防止影响其它代码的警告信息
#pragma warning(disable: 4702)

...

#pragma warning(pop)
      
 #pragma comment(lib, "hcnetsdk.lib"); //加载lib库
 //设置共享数据段
      #pragma   data_seg( "Shared ")
HHOOK   g_hhook   =   NULL;
DWORD   g_dwThreadIdDIPS   =   0;
#pragma   data_seg()
  1.6 #undef
  取消前面#define的一个值
  1.7
  __LINE__ 和 __FILE__ 变量表示正在处理的当前行和当前文件.
  __DATE__ 变量表示当前日期,格式为month/day/year(月/日/年).
  __TIME__ 变量描述当前的时间,格式为hour:minute:second(时:分:秒).
  _cplusplus 变量只在编译一个C++程序时定义.
  __STDC__ 变量在编译一个C程序时定义,编译C++时也有可能定义.

strDataAndTime.Format(L"Date:%s,Time:%s", _CRT_WIDE(__DATE__), _CRT_WIDE(__TIME__));



你可能感兴趣的:(C++标准库(预处理器))