Visual studio 下C++工程相关经验

1. 利用vs2015编译C++检查宏参数错误

Format Specifiers Checking

#ifdef WIN32

#pragma warning (error: 4473)
#pragma warning (error: 4474)
#pragma warning (error: 4475)
#pragma warning (error: 4476)
#pragma warning (error: 4477)
#pragma warning (error: 4478)

//#pragma warning (error: 4774)
#pragma warning (error: 4775)
#pragma warning (error: 4776)
//#pragma warning (error: 4777)
#pragma warning (error: 4778)

/**< https://blogs.msdn.microsoft.com/vcblog/2015/06/22/format-specifiers-checking/ 利用vs2015 Format Specifiers Checking功能检测日志格式化错误 */

#define HMI_LOGE(module, format, ...)               if(false){printf(format, ##__VA_ARGS__);}ALCLOGE(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGW(module, format, ...)               if(false){printf(format, ##__VA_ARGS__);}ALCLOGW(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGI(module, format, ...)               if(false){printf(format, ##__VA_ARGS__);}ALCLOGI(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGD(module, format, ...)               if(false){printf(format, ##__VA_ARGS__);}ALCLOGD(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGP(module, format, ...)               if(false){printf(format, ##__VA_ARGS__);}ALCLOGP(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGDT(module, format, ...)               if(false){printf(format, ##__VA_ARGS__);}ALCLOGD(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGET(module, format, ...)               if(false){printf(format, ##__VA_ARGS__);}ALCLOGE(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)

#define HMI_LOGE_UNI(module, format, ...)           if(false){wprintf(format, ##__VA_ARGS__);}ALCLOGE16(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGW_UNI(module, format, ...)           if(false){wprintf(format, ##__VA_ARGS__);}ALCLOGW16(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGI_UNI(module, format, ...)           if(false){wprintf(format, ##__VA_ARGS__);}ALCLOGI16(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGD_UNI(module, format, ...)           if(false){wprintf(format, ##__VA_ARGS__);}ALCLOGD16(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGP_UNI(module, format, ...)           if(false){wprintf(format, ##__VA_ARGS__);}ALCLOGP16(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGDT_UNI(module, format, ...)           if(false){wprintf(format, ##__VA_ARGS__);}ALCLOGD16(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGET_UNI(module, format, ...)           if(false){wprintf(format, ##__VA_ARGS__);}ALCLOGE16(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)

#else

#define HMI_LOGE(module, format, ...)               ALCLOGE(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGW(module, format, ...)               ALCLOGW(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGI(module, format, ...)               ALCLOGI(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGD(module, format, ...)               ALCLOGD(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGP(module, format, ...)               ALCLOGP(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#if !defined(PLATFORM_PIVI) || defined(GPLAT_APLUS3AUTO)
#define HMI_LOGET(module, format, ...)               ALCLOGE(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGDT(module, format, ...)               ALCLOGD(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#else
#define HMI_LOGDT(module, format, ...)               HSL_ALCLOGT_(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#define HMI_LOGET(module, format, ...)               HSL_ALCLOGT_(GLOG_MODULE_HMI, module, format, ##__VA_ARGS__)
#endif
View Code

1、链接其他库调试时产生告警: warning LNK4099: 未找到 PDB“vc100.pdb”

解决方案:属性 -> C/C++ -> 输出文件 -> 程序数据库文件名 -> $(OutDir)$(TargetName).pdb  生成的pdb文件将同库在同一目录)

2、文件编码问题: warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失

解决方案:打开提示该Warning的文件,选择菜单中的:文件 -> 高级保存选项,将“编码”选择为“Unicode - 代码页 1200”,重新编译即可。(简体中文的可能也行)

3、编译静态库时Release版反而比Debug版大很多

解决方案:在VisualStudio中的Release工程中,C++ -> Optimization -> Whole Program Opeimization 默认是启用的,而Debug版的就没有这个标志,所以编译起来Release版反而大很多。具体原因是:LTCG(Link-time Code Generation),编译器需要启用/GL,连接器需要启用/LTCG,两者配合达到链接可执行程序时最终优化整合的效果,可以去除obj的重复,更好的优化代码。不过缺点就是链接速度慢。

4、Visual assist 助手

  安装了番茄助手后,在菜单中选择 VAssistX -> Tools -> Edit VA Snippet 就会出现模板菜单,在里面可以定制快捷键插入模板代码。

 

原文地址:https://www.cnblogs.com/kuliuheng/p/5592504.html