小编Vin*_*Pii的帖子

如何让Vim在访问STL容器时识别对象类型,以实现自动完成

我有omnicppcomplete插件和繁琐的ctags,我使用以下命令为项目生成标签:

ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
Run Code Online (Sandbox Code Playgroud)

我想要实现的是让Vim在通过STL容器访问它时识别对象的类型,为我提供适当的自动完成建议列表.

例如,假设IntWrapper对象有一个getTheInt()方法,我有一个向量IntWrappers:

std::vector<IntWrapper> wrappers;
Run Code Online (Sandbox Code Playgroud)

如果我有以下代码:

for (size_t i = 0; i < wrappers.size(); i++) {
    wrappers[i].<VIM Cursor is here>
}
Run Code Online (Sandbox Code Playgroud)

我希望VIM理解wrapper [i]是类型的,IntWrapper并且给我getTheInt()作为第一个自动完成选择的方法以及文档,就像我直接在IntWrappers对象上操作一样.

为了弄清楚我的期望,下面的第一个截图是当我要求对向量自动完成时会发生什么,第二个是当我直接访问对象时会发生什么,以及即使使用stl容器我也想要实现的.

表达未找到

(上面用红色突出显示的句子表示未找到表达式)

工作

有没有插件(我不关心CPU昂贵)这样做?

非常感谢.

c++ vim stl autocomplete

3
推荐指数
1
解决办法
762
查看次数

为什么删除指向指针向量的指针会导致指针无效?

编辑:谢谢你的答案!我声明该tellSomething方法的std::string返回类型应该是void!

我绊倒自己并指责这个可怜的无畏delete运营商:)!


让我们考虑一个指向动态分配的指针,vector它包含指向动态分配对象的指针:

// Create the vector of pointers
std::vector<A *>* v = new std::vector<A *>;

// Create two objects
A *a1 = new A;
A *a2 = new A;

// Populate the vector
v->push_back(a1);
v->push_back(a2);

// Delete the vector
delete v;

// Try accessing one of the objects
a1->tellSomething();    --> // Segmentation fault
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,如果我删除了vector,delete则不会调用包含的对象(我也验证A::~A()过在上面的代码中从未调用过),但是,最后一条指令会产生分段错误.

delete v对此的期望是两件事:

  • 调用每个包含对象的析构函数
  • 容器被解除分配

但在这种情况下,包含的对象是指针,因此不会调用析构函数.

此外, …

c++ destructor delete-operator

3
推荐指数
2
解决办法
391
查看次数

for循环不运行

我提出了我认为对于一个尴尬(尽管标准)问题的混乱解决方案:对于给定的用户输入,反转单词的字母

例如:

这是标准测试

sihT si a dradnats tset

并不是

tset dradnats a si sihT

事情的核心是这段代码

  while (!iscntrl(user_input[x])) // quit when new line is read
      {
        restart:
        x++;
        puts("first level test");
        if (user_input[x]==' ')
            {
            puts("second level test");
            for (i=x; user_input[i]!=' '; --i)
                {               
                reverse_words[k]=user_input[i];
                k++;
                puts("third level test");
                goto restart;
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

(是的,我知道,那里有一个goto:/)

但是循环的第三级永远不会被触及.

据推测,(i=x; user_input[i]!=' '; --i)作为for循环参数有一些完全错误的东西?

x,ik,在第一个循环开始之前都被初始化为整数== 0.

c for-loop nested-loops

3
推荐指数
1
解决办法
102
查看次数

如何用vim理解代码?

Vim是一个不错的编辑器,我将它用于许多任务.

但是,当开始处理一个新的(可能是巨大的)代码库时,我不习惯使用它来解决代码,目的是了解事情是如何工作的.

例如,如果我想查看C++函数的使用位置,我可以:vimgrep在每个**/*.cpp文件中使用该函数,并且:copenquickfix窗口可以在每次出现时跳转到该字符串.

如果我对例如Eclipse(C++方法的调用层次结构)做同样的事情,那不仅仅是一个字符串,而是一个在对象中定义的C++方法,所以我将得到该函数的用法的精确指示(而不是也是在另一个类中定义的同名函数).

那么问题是,如何使vim成为分析代码的强大工具?

子问题:

  • 有没有为此设计的vim插件?
  • 使用vim只分析代码是否有意义?可能外部工具(例如:OpenGrok)可以完成这项工作吗?

vim code-analysis

3
推荐指数
1
解决办法
1076
查看次数

默认情况下,C中的基本数据类型是可变的还是不可变的?

我在C#,java中找到了很多关于数据类型可变性的信息......但是纯粹的C.

例如,int默认情况下在C中是不可变的吗?

例如,查看以下代码示例:

#include <stdio.h>

int main()
{
  int a,b,c;
  b=0;
  c=0;
  a=b+c;
  b=1;
  c=2;

  printf("1st time %d\n",a);//gives out 0
  c=3;
  printf("2nd time %d",a);//gives out 0
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码表明普通int是不可改变的,对吗?

c variables types

2
推荐指数
2
解决办法
3464
查看次数

在c ++中按值调用时存储变量副本的位置

我想知道,当我们通过值调用一个函数时,它会复制一个变量,但是在内存中存储了这个变量的副本

c++

2
推荐指数
1
解决办法
125
查看次数

是否需要临时或文字来获得右值?

这个问题询问所有临时值是否都是右值.

答案是否定的,因为如果我们考虑这个表达式:

const int &ri = 2 + 3;
Run Code Online (Sandbox Code Playgroud)

那么,同样的临时(2 + 3)值(这里是一个右值)可以用作后续表达式中的左值:

const int *pi = &ri;
Run Code Online (Sandbox Code Playgroud)

所以这个临时不是(仅)一个右值.

然后逻辑语句temporary ==> rvalue是错误的.

但是,我们不能写

const int &ri = &(2 + 3); // illegal, 2 + 3 -> temporary -> rvalue
Run Code Online (Sandbox Code Playgroud)

要么

int *i = &4; // illegal, 4 is an rvalue (literal)
Run Code Online (Sandbox Code Playgroud)

要么

int foo();
int *i = &foo(); // illegal, foo() -> temporary -> rvalue
Run Code Online (Sandbox Code Playgroud)

因此我的问题是,我们可以在某个表达式中生成一个rvalue而不需要临时或文字吗?是rvalue ==> (temporary or literal)真的吗?

c++ temporary rvalue

1
推荐指数
1
解决办法
188
查看次数

如何获取字符串的一部分

如何获取字符串的一部分.

例如,字符串是:

输入字符串:"53 56 4B 00 00 41 41 2F 41 54 43 43 54 52 31 2E 41 54 31 2E 4E 37 38"

               |                                        |
              ptr1                                     ptr2  
Run Code Online (Sandbox Code Playgroud)

ptr1 它总是从左到右从第7位开始

ptr2 从右到左,它总是处于第13位

输出字符串:

4B 00 00 41 41 2F 41 54 43 43 54 52 31 2E 41 54 31
Run Code Online (Sandbox Code Playgroud)

c c++ string

0
推荐指数
1
解决办法
204
查看次数

表达式c

所以我有以下表达式

int *(*table())[30];
Run Code Online (Sandbox Code Playgroud)

在我看来table()返回一个值,该值指向指针数组的开头,每个元素指向一个整数.

你怎么看?

谢谢.

c pointers function

0
推荐指数
1
解决办法
139
查看次数