Editplus配置VC++(2) 与/d1reportSingleClassLayout
前篇文章:Editplus配置VC++(1) 及相关注意事项
VC++有两个隐含编译选项/d1reportSingleClassLayout和/d1reportAllClassLayout /d1 reportSingleClassLayout和/d1 reportAllClassLayout或将/改为-都行
比如
cl.exe /d1reportSingleClassLayoutClassName //ClassName前面无空格
//或
cl.exe /d1reportAllClassLayout
但是,ClassName是类名的substring,任何匹配它的类名都会被输出。比如想看class A,你输入了/d1reportSingleClassLayoutA,但是你会发现会编译器输出很多无关的类,如struct ABC、Class inAttribute Class dbA...因为它们的类名都包含有A这个字母。
你可能说是不是因为#include了库的缘故,如#include<iostream>,把它去掉呢。。。试了,你会发现还不行。。。cl.exe有很多编译选项,如/X忽略标准include目录,但我一一试了,都没什么用。。。把下面批处理中的call "%VS120COMNTOOLS%vsvars32.bat"去了也不行(去掉该语句能加快启动速度,但不推荐,因为不包含库的话,若类包含有库中的类对象,cl.exe如何正确计算类的布局呢)
至于,/d1reportAllClassLayout相比/d1reportSingleClassLayout,无用的输出只多不少,因此这里不用它。。。
既然不行,就只能捕获标准输出,然后过滤掉了无用的信息了。依然在VC++目录建立个bat文件,内容如下:
@echo off call "%VS120COMNTOOLS%vsvars32.bat" if "%2" == "" goto error
if "%1" == "" goto error
cl.exe /nologo /w /Zs /d1reportSingleClassLayout% %
goto :eof :error
echo Error:参数错误 - 是否划定了类名?
goto :eof
其实没什么,就是调用了下cl.exe而已。/Zs选项是只检查语法,不产生.obj .exe等文件了。。。
怎么捕获编译输出,这需要用到Windows里的匿名通道来重定向标准输出。这里我们编写个控制台程序clsLayout.exe,它会被EditPlus调用。而clsLayout.exe里会创建通道并创建子进程执行批处理。然后捕获批处理的标准输出,并过滤内容,只输出想要的。。。
这里直接贴代码了,如下,其中CMDLine函数是我在网上找的,直接拿来修改了
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
using namespace std; char g_name[] = {}; bool CMDLine(char* cmd)
{
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite; sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead, &hWrite, &sa, ))
{
cout << "CreatePipe失败" << endl;
return false;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
ZeroMemory(&pi, sizeof(pi));
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; if (!CreateProcess(NULL, cmd, NULL, NULL, TRUE, , NULL, NULL, &si, &pi))
{
cout << "CreateProcess失败" << endl;
return false;
}
CloseHandle(hWrite); char buffer[] = { };
DWORD bytesRead; bool bFindIt = false;
bool bFindEnd = false;
char *pBegin = NULL;
char *pError = NULL;
//// ofstream ofile("c:\\out2.txt", ios_base::binary); cout << "Waiting..." << endl;
//WaitForSingleObject(hRead,INFINITE);
while (ReadFile(hRead, (LPVOID)&buffer, , &bytesRead, NULL))
{
buffer[bytesRead] = '\0';
////// ofile << "Block:\n";
//// ofile << (char*)buffer;
//// continue; if(pError = strstr(buffer, "error C")) //输出错误
{
char *pReturn = strstr(pError, "\r");
if(pReturn)
{
*pReturn = '\n';
*(pReturn+) = '\0';
}
cout << pError << (pReturn?"":"\n");
continue;
} if(!bFindIt && (pBegin = strstr(buffer, g_name)))
{
system("cls");
bFindIt = true; char *pEnd = strstr(pBegin, "\r\n\r\n\r\n"); //每个class间至少3个
if(pEnd)
{
*(pEnd+) = '\0';
bFindEnd = true;
} cout << "class" << pBegin;
continue;
} if(bFindIt && !bFindEnd)
{
char *pEnd = strstr(buffer, "\r\n\r\n\r\n");
if(pEnd)
{
*(pEnd+) = '\0';
bFindEnd = true;
} cout << (char*)buffer;
}
} //// ofile.close();
if(false == bFindIt)
cout << "\n未找到class" << g_name << endl << endl; return true;
} int main(int argc, char*argv[])
{
if(argc != )
goto end; //cout << argv[1] << endl;
//cout << argv[2] << endl; char *cppPath = argv[];
while(*cppPath)
cppPath++;
if(cppPath - argv[] < || _strnicmp(cppPath-, ".cpp", ))
goto end;
if(*argv[] == '\0')
goto end;
else
_snprintf(g_name, 100, " %s\t", argv[2]); char cmd[] = {};
_snprintf(cmd, , "D:\\VS\\VS2013\\VC\\bin\\classLayout.bat \"%s\" \"%s\"", argv[], argv[]); CMDLine(cmd);
return ; end:
cout << "error: 输入参数不正确,是否已选中类名?" << endl;
return ;
}
- 里面的ofile用来将所有捕获到的内容输出到文件的,想打开它,取消里面的////注释即可!!!
- 里面的_snprintf(g_name, 100, " %s\t", argv[2]),是为了尽可能查找到类名,若改为"class %s\t",有时会找不到,因为ReadFile是按块读取的,两个块有可能从"class %s"中间断开。。。我们这样减小了这种可能,,当然,只是减小而已。
- 这也会过滤error warning等
- struct的内存布局输出前缀也是"class"
编译生成clsLayout.exe后,Editplus里添加工具,如下:
$(CurSel)是鼠标选择的文本。。。
在Visual Studio里也可以配置的,通过:工具 - 外部工具 - 添加,截图如下 :
使用前,应确保所选择的cpp文件能单独编译成功
使用:调用该工具前,必须先用鼠标框选上你想看的类名!!然后点击工具图标或按快捷键Ctrl+5等。
使用动图:
Editplus配置VC++(2) 与/d1reportSingleClassLayout的更多相关文章
- Editplus配置VC++(1) 及相关注意事项
下篇文章:Editplus配置VC++(2) 与/d1reportSingleClassLayout 原本用的是VC++2010 现在换成了Visual Studio 2013,editplus相关配 ...
- Editplus配置Java、Python、C/C++ (基于VS2010) 编译环境
1. 为什么要配置EditPlus使其能够编译运行Java.Python.C/C++等程序? EditPlus是一款轻量级(大约2M)的文本编辑器,实际开发中,只需要关联相应的编译工具就可以化身为一个 ...
- EditPlus配置[C++] [Python] [Java] 编译运行环境
以前一直用Codeblocks写C++,eclipse写Java,再在eclipse里面集成PyDev写Python,首先无法忍受代码自动补全功能(这个功能也许你万分喜欢),也无法忍受如此重量级的ID ...
- Editplus配置java运行环境
Editplus配置java运行环境 下载及安装: editplus官网下载地址:https://www.editplus.com/ 安装方法和安装普通exe应用程序一样,选在安装路径,下一步下一步, ...
- Editplus配置java编译环境
EditPlus配置java编译环境 第一步:检测自己是否已经有jdk 1.win+r,输入cmd,打开控制台 2.控制台下输入javac出现类似的画面,代表jdk已经成功安装 第二步:打开Editp ...
- EditPlus+VisualStudio配置VC简易开发环境环境
对于C++开发, 我想在Windows下大家用的最多的应该是MS的VC++.但其强大的功能背后却有着"启动速度慢","占用资源多"的缺点,尤其是VS后 ...
- EditPlus 配置 Java & C/CPP 开发环境
0.1安装EditPlus 0.2安装Java 0.3安装MinGW 0.4配置Java和MinGW环境变量 1.配置Java开发环境 1.1 Tool-->Preferences 1.2 Ja ...
- editplus配置详:
1:设置删除整行快捷键 2:设置背景颜色 3:php 开发环境 在 http://download.csdn.net/detail/vspeter/6002287 下载 editplus 的php语法 ...
- 应用 EditPlus 配置 Java 编译环境
此文全文摘抄自: http://jingyan.baidu.com/album/37bce2be3ceef61002f3a208.html?picindex=7,谢啦 应用成功: EditPlus(文 ...
随机推荐
- python httprequest, locust
r = self.client.get("/orders", headers = {"Cookie": self.get_user_cookie(user[0] ...
- ps用画笔工具设计水墨圆环
1.打开ps,新建一个1500*1500px的空白文档,分辨率为72,背景选择白色,如图: 2.选择画笔工具,按F5调出画笔预设面板,设置参数. 画笔笔尖形状:选择27号画笔,找不到可以复位一下画笔: ...
- eclipse下导入jdk源码
一直想好好看看jdk的源码,虽然可以直接解压jdk下的src看,但是终究不方便!后来发现可以导入到eclipse中,就在网上找了一些方法,下面就和大家分共享: step1:打开eclipse选择Win ...
- cookie和session简单的用法
一.登录成功则设置cookie和session 二.在登录页判断是否已记住密码 三.在首页判断,和创建会话区 四.在首页执行并显示
- WebForm 页面传值
一.使用Querystring Querystring是一种非常简单的传值方式,其缺点就是会把要传送的值显示在浏览器的地址栏中,并且在此方法中不能够传递对象.如果你想传递一个安全性不是那么太重要或者是 ...
- win7&win8.1 x64位系统下在VS2010下配置MPICH2&测试&解决scanf不能输入
1. Mpich下载地址http://www.mpich.org/downloads/,下载mpich2-1.4.1p1-win-x86-64(32位系统请下载mpich2-1.4.1p1 ...
- HTML5中使用SVG
SVG 即 Scalable Vector Graphics,是一种用来绘制矢量图的 HTML5 标签.你只需定义好XML属性,就能获得一致的图像元素. 使用SVG之前先将标签加入到HTML body ...
- bzoj3884 上帝与集合的正确用法
a^b mod P=a^(b mod phi(p)) mod p,利用欧拉公式递归做下去. 代码 #pragma comment(linker,"/STACK:1024000000,1024 ...
- 网站登录后会话无法保存。php环境
在php 页面中phpinfo() 看下session 是否存在.session 的path 是否设置.具体的还要自己检查. 1.php.ini中的output_buffering=off 改成out ...
- Python 多线程教程:并发与并行
转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...