我有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昂贵)这样做?
非常感谢.
编辑:谢谢你的答案!我声明该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对此的期望是两件事:
但在这种情况下,包含的对象是指针,因此不会调用析构函数.
此外, …
我提出了我认为对于一个尴尬(尽管标准)问题的混乱解决方案:对于给定的用户输入,反转单词的字母
例如:
这是标准测试
变
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,i和k,在第一个循环开始之前都被初始化为整数== 0.
Vim是一个不错的编辑器,我将它用于许多任务.
但是,当开始处理一个新的(可能是巨大的)代码库时,我不习惯使用它来解决代码,目的是了解事情是如何工作的.
例如,如果我想查看C++函数的使用位置,我可以:vimgrep在每个**/*.cpp文件中使用该函数,并且:copenquickfix窗口可以在每次出现时跳转到该字符串.
如果我对例如Eclipse(C++方法的调用层次结构)做同样的事情,那不仅仅是一个字符串,而是一个在对象中定义的C++方法,所以我将得到该函数的用法的精确指示(而不是也是在另一个类中定义的同名函数).
那么问题是,如何使vim成为分析代码的强大工具?
子问题:
我在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是不可改变的,对吗?
这个问题询问所有临时值是否都是右值.
答案是否定的,因为如果我们考虑这个表达式:
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)真的吗?
如何获取字符串的一部分.
例如,字符串是:
输入字符串:"53 56 4B 00 00 41 41 2F 41 54 43 43 54 52 31 2E 41 54 31 2E 4E 37 38"
Run Code Online (Sandbox Code Playgroud)| | ptr1 ptr2
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) 所以我有以下表达式
int *(*table())[30];
Run Code Online (Sandbox Code Playgroud)
在我看来table()返回一个值,该值指向指针数组的开头,每个元素指向一个整数.
你怎么看?
谢谢.
c++ ×5
c ×4
vim ×2
autocomplete ×1
destructor ×1
for-loop ×1
function ×1
nested-loops ×1
pointers ×1
rvalue ×1
stl ×1
string ×1
temporary ×1
types ×1
variables ×1