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%2 %1
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[101] = {};

bool CMDLine(std::string cmd)
{
    SECURITY_ATTRIBUTES sa;
    HANDLE hRead,hWrite;

    sa.nLength=sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor=NULL;
    sa.bInheritHandle=TRUE;
    if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
        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, (char*)cmd.c_str(),NULL,NULL,TRUE,0,NULL,NULL,&si,&pi)) {
        cout << "CreateProcess失败" << endl;
        return false;
    }
    CloseHandle(hWrite);

    char buffer[128]={0};
    DWORD bytesRead;

    bool bFindIt = false;
    bool bFindEnd = false;
    char *pBegin = NULL;
    ////ofstream ofile("c:\\out2.txt", ios_base::binary);    

    cout << "Waiting..." << endl;
    //WaitForSingleObject(hRead,INFINITE);
    while (ReadFile(hRead,(LPVOID)&buffer,127,&bytesRead,NULL))
    {
        buffer[bytesRead] = ‘\0‘;
        ////ofile << (char*)buffer;
        ////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+6) = ‘\0‘;
                bFindEnd = true;
            }

            cout << "class" << pBegin;
            continue;
        }

        if(bFindIt && !bFindEnd)
        {
            char *pEnd = strstr(buffer, "\r\n\r\n\r\n");
            if(pEnd)
            {
                *(pEnd+6) = ‘\0‘;
                bFindEnd = true;
            }

            cout << (char*)buffer;
        }
    }

    ////ofile.close();
    if(false == bFindIt)
        cout << "未找到class" << g_name << endl << endl;

    return true;
}

int main(int argc, char*argv[])
{
    if(argc != 3)
        goto end;

    char *cppPath = argv[1];
    while(*cppPath)
        cppPath++;
    if(cppPath - argv[1] < 5 || _strnicmp(cppPath-4, ".cpp", 4))
        goto end;
    if(*argv[2] == ‘\0‘)
        goto end;
    else
        _snprintf(g_name, 100, " %s\t", argv[2]);

    char cmd[201] = {};
    _snprintf(cmd, 200, "D:\\VS\\VS2013\\VC\\bin\\classLayout.bat \"%s\" \"%s\"", argv[1], argv[2]);

    CMDLine(cmd);
    return 0;

    end:
        cout << "error: 输入参数不正确" << endl;
        return 0;
}
  1. 里面的ofile用来将所有捕获到的内容输出到文件的,想打开它,取消里面的////注释即可!!!
  2. 里面的_snprintf(g_name, 100, " %s\t", argv[2]),是为了尽可能查找到类名,若改为"class %s\t",有时会找不到,因为ReadFile是按块读取的,两个块有可能从"class %s"中间断开。。。我们这样减小了这种可能,,当然,只是减小而已。
  3. 这也会过滤error warning等
  4. struct的内存布局输出前缀也是"class"

编译生成clsLayout.exe后,Editplus里添加工具,如下:

$(CurSel)是鼠标选择的文本。。。

Visual Studio里也可以配置的,通过:工具 - 外部工具 - 添加 。。。这里就略了

使用:调用该工具前,必须先用鼠标框选上你想看的类名!!然后点击工具图标或按快捷键Ctrl+5等。

使用动图:

时间: 2024-12-11 18:31:18

Editplus配置VC++(2) 与/d1reportSingleClassLayout的相关文章

Editplus配置VC++及相关注意事项

原本用的是VC++2010 现在换成了Visual Studio 2013,editplus相关配置方法基本不变.采用的办法是网上找到的cl.bat方法,这里总结下: 到VC的安装目录下,我这里是D:\VS\VS2013\VC\bin,在这里大家应该能看到vcvars32.bat和cl.exe两个文件.新建个文本文件,改名为cl.bat,我这里精简下,内容为: @echo off call "%VS120COMNTOOLS%vsvars32.bat" if "%1"

Editplus配置Java、Python、C/C++ (基于VS2010) 编译环境

1. 为什么要配置EditPlus使其能够编译运行Java.Python.C/C++等程序? EditPlus是一款轻量级(大约2M)的文本编辑器,实际开发中,只需要关联相应的编译工具就可以化身为一个轻量级的IDE.EditPlus本身不具有编译运行程序的功能,开发Java.Python.C/C++通常会选择Eclipse, MS VC++等IDE,但其强大的功能背后却有着“启动速度慢”,“占用资源多”的缺点.当然,这也十分正常,鱼和熊掌向来是很难兼得.用这个大家伙开发公司的大项目,用起来自然是

Editplus配置java编译环境

EditPlus配置java编译环境 第一步:检测自己是否已经有jdk 1.win+r,输入cmd,打开控制台 2.控制台下输入javac出现类似的画面,代表jdk已经成功安装 第二步:打开Editplus 1.选择工具下-->配置用户工具 2.选择用户工具==>添加工具==>选择应用程序(program) 3.配置javac,即编译环境 博主的路径 4.配置java,即运行 第三步:测试 1.新建java文件 2.代码如下,要用Ctrl+S保存,注意类名和文件名的关系 3.编译,Too

Editplus配置java运行环境

Editplus配置java运行环境 下载及安装: editplus官网下载地址:https://www.editplus.com/ 安装方法和安装普通exe应用程序一样,选在安装路径,下一步下一步,第一次打开时会自动弹出提示注册信息.注册序列化可百度“”editplus在线注册“即可注册. Editplus配置java环境 注册之后打开tools中configure User tools用户工具配置选项,如下: 配置javac命令: 第一步选择 Add Tool>>   Menu text填

EditPlus+VisualStudio配置VC简易开发环境环境

? ? ?对于C++开发, 我想在Windows下大家用的最多的应该是MS的VC++.但其强大的功能背后却有着"启动速度慢","占用资源多"的缺点,尤其是VS后来的版本,速度不是一般的慢而且极其臃肿.当然,这也十分正常,鱼和熊掌向来是很难兼得.用这个大家伙开发公司的大项目,用起来自然是得心应手:但对于一般的小程序,就有点"杀鸡用牛刀"的感觉了.然而,无论在工作还是平时自己学习中,写个小程序,通常只要一个cpp文件就可以的测试程序还是经常有的事.这

editplus配置csharp

只要是写代码的,我们肯定常有用到EditPlus..Net开发也是如此.有时我们需要调试一小段C#(或VB.Net)代码,这时去大动干戈在臃肿的VS.Net中新建“控制台应用程序”项目,写满“Console.ReadLine()”,总会有点不爽吧?这时你肯定想到要在EditPlus中配置C#运行环境了.直接在EditPlus中运行C#多舒服? 打开GOOGLE,输入“善用EditPlus构建精悍的C#编译环境”,或者“在EditPlus里配置C#的编写环境全过程”.一搜索,符合查询结果的有多少?

EditPlus配置编译运行Java程序

打开EditPlus,在菜单栏中依次点击Tools和Configure User Tools...,如下图所示: 修改组名 编译Java程序 点击OK即可: 运行Java程序 过程与第三步类似,但配置如下: 至此,EditPlus就算是配置完成了,在Tools中出现如下图标: public class HelloWorld{    public static void main(String[] args)    {        System.out.println("Hello World&

使用Editplus配置PHP调试环境

工欲善其事必先利其器,最近看了很多PHP的IDE介绍,最后选择了Editplus,下面说说一些PHP的调试环境配置问题. 1. 添加PHP模板 第一步 新建->其它->php 第二步 输入 第三步 保存为template.php 第四步 工具->首选项->模板 第五步 点击添加template.php并在菜单文本中输入php即可 这样,再次新建文件之后就有php选项,新建之后就会出现之前如模板一样的内容. 2.添加函数自动完成功能 要实现自动完成功能需要下载php.acp 第一步

应用 EditPlus 配置 Java 编译环境

EditPlus(文字编辑器)一套功能强大,可取代记事本的文字编辑器,EditPlus拥有无限制的撤消与重做.英文拼字检查.自动换行.列数标记.搜寻取代.同时编辑多文件.全屏幕浏览功能.而它还有一个好用的功能,就是它有监视剪贴板的功能,能够同步于剪贴板自动将文字粘贴进 EditPlus 的编辑窗口中,让你省去粘贴的步骤.另外它也是一个非常好用的 HTML 编辑器,它除了支持颜色标记.HTML 标记,同时支持 C.C++.Perl.Java,另外,它还内建完整的HTML & CSS1 指令功能,对