我曾经碰过一些东西,想知道这是一个Python"bug"还是至少是一个错误的.我很好奇是否有人知道这种行为的任何理由.我刚想起了"像Python一样的代码",到目前为止一直很愉快.我只熟悉2.x系列的Python.
原始字符串是以前缀为前缀的字符串r.这很好,因为我可以在正则表达式中使用反斜杠,我不需要在任何地方加倍.在Windows上编写一次性脚本也很方便,所以我也可以在那里使用反斜杠.(我知道我也可以使用正斜杠,但是一次性脚本通常包含从Windows其他地方剪切和粘贴的内容.)
很好!当然,除非你真的希望你的字符串以反斜杠结尾.在'原始'字符串中没有办法做到这一点.
In [9]: r'\n'
Out[9]: '\\n'
In [10]: r'abc\n'
Out[10]: 'abc\\n'
In [11]: r'abc\'
------------------------------------------------
File "<ipython console>", line 1
r'abc\'
^
SyntaxError: EOL while scanning string literal
In [12]: r'abc\\'
Out[12]: 'abc\\\\'
Run Code Online (Sandbox Code Playgroud)
所以在结束引号之前的一个反斜杠是一个错误,但是两个反斜杠给你两个反斜杠!当然,我不是唯一一个被这个困扰的人吗?
关于为什么'原始'字符串是'原始的,除了反斜杠引用'的想法?我的意思是,如果我想在那里嵌入单引号,我只是在字符串周围使用双引号,反之亦然.如果我想要两者,我只是三重引用.如果我真的想在原始字符串中连续三个引号,那么,我想我必须处理,但这被认为是"正确的行为"吗?
对于Windows中的文件夹名称,这尤其成问题,其中反斜杠是路径分隔符.
通常,数据结构的有效初始化是将所有成员设置为零.即使使用C++进行编程,也可能需要与外部API进行交互.
以下是否有任何实际区别:
some_struct s;
memset(&s, 0, sizeof(s));
Run Code Online (Sandbox Code Playgroud)
简单地说
some_struct s = { 0 };
Run Code Online (Sandbox Code Playgroud)
人们发现自己都使用这两种方法,选择哪种方法更适合给定的应用程序?(希望据了解,这只适用于POD结构;如果该结构中存在C++ std :: string,则会遇到各种各样的破坏.)
对于我自己来说,作为一个不使用memset的C++程序员,我从不确定函数签名,所以我发现第二个例子更容易使用,除了更少打字,更紧凑,甚至更多很明显,因为它在声明中说"这个对象被初始化为零"而不是等待下一行代码并且看到"哦,这个对象初始化为零".
在C++中创建类和结构时,我倾向于使用初始化列表; 我很好奇人们对上面两个"C风格"初始化的想法,而不是与C++中可用的内容进行比较,因为我怀疑我们很多人都与C库接口,即使我们自己主要用C++编写代码.
编辑: Neil Butterworth 在后续提出这个问题,我认为这是这个问题的一个有趣的推论.
我有这个日志系统,我正在寻找一些字符串操作的快捷方式.
日志系统通过功能宏使用,然后转发到单个函数调用.例如#define Warning(...) LogMessage(eWarning, __VA_ARGS__);.
然后LogMessage snprintf进入一个新的缓冲区,然后将该消息提供给碰巧安装的任何日志目标; printf,OutputDebugString等
不幸的是,我遇到了一个问题,即我们所拥有的缓冲区不够大,因此输出会被截断.我还意识到,如果输出消息中包含百分比符号,则此方法将失败,因为snprintf将尝试处理va_args.最后,因为我们的大多数日志消息都不使用va_args,所以复制字符串只是为了将它呈现给记录器似乎很愚蠢.
那么 - 鉴于我的函数原型,我是否应该能够根据省略号的存在进行重载?换句话说,我是否可以假设我可以做以下事情:
LogMessage(LogLevel, const char* message, ...);
LogMessage(LogLevel, const char* message);
Run Code Online (Sandbox Code Playgroud)
我的谷歌尝试没有产生任何特别有用的东西(只是告诉我椭圆将匹配,如果没有别的,根据我的要求,没有任何匹配),我的初始实施只是给了我一个模糊的函数调用错误.
有了这个错误,我应该接受我不能这样做,但我想知道它是否只是我正在使用的编译器,或者我是否做错了.我可以达到类似的效果
// edited version of what I really have to remove our local APIs,
// please excuse minor errors
const char* message = NULL;
char buffer[512];
va_list args;
va_start(args, format);
if(strcmp(format, "%s") == 0) {
message = va_arg(args, const char*);
}
else if (strchr(format, '%') == NULL) {
message = format;
}
else …Run Code Online (Sandbox Code Playgroud) 我最近在这个平台上工作,遗留代码库会发出大量"强制转换需要对齐N"警告,其中N是演员目标的大小.
struct Message
{
int32_t id;
int32_t type;
int8_t data[16];
};
int32_t GetMessageInt(const Message& m)
{
return *reinterpret_cast<int32_t*>(&data[0]);
}
Run Code Online (Sandbox Code Playgroud)
希望很明显,"真正的"实现会有点复杂,但基本的一点是我有来自某个地方的数据,我知道它是对齐的(因为我需要id和类型对齐),以及然而我得到的消息是,演员正在增加对齐,在示例中,为4.
现在我知道我可以用编译器的参数来抑制警告,我知道我可以先将括号中的位转换为void*,但我真的不想通过需要这个的所有代码一种操作(有很多因为我们从磁盘上加载了大量数据,并且这些数据以char缓冲区形式出现以便我们可以轻松地指针前进),但是有人能给我关于这个问题的任何其他想法吗?我的意思是,对我来说,似乎是一个非常重要和常见的选择,你不想要警告,如果实际上有可能做错了,那么抑制警告就没有用了.最后,编译器不能像我一样知道所讨论的对象是如何在结构中实际对齐的,所以它应该能够不担心该特定对象的对齐,除非它碰到了一个或两个字节?
这是我的文字:
xxx
yyy
zzz
Run Code Online (Sandbox Code Playgroud)
我希望它成为这个文本:
xxx = C.xxx
yyy = C.yyy
zzz = C.zzz
Run Code Online (Sandbox Code Playgroud)
这可以在Vim中做到吗?
在大多数情况下,我发现区分大小写的标签搜索是合适的.我们使用的大多数语言都区分大小写,因此这是可取的.
但是,我在我的工作场所使用DSL,它使用不区分大小写的标识符.我产生这种DSL的标签,我甚至可以用foldcase对它进行排序(并设置在标记文件中的相应标志),但是,Vim依然显得做标识符区分大小写的匹配.
我喜欢的是,如果Vim能够将"折叠案例"标记文件理解为"此语言不区分大小写".有这样的设置吗?
我想我可以打开ignorecase了该文件类型(我切换出标签文件反正更改一些其他设置),但随后的Vim我咆哮时的情况不符.我只是喜欢的方式来告诉Vim的,"嘿,这是不区分大小写所以没关系,你不需要我大声喊叫了." 一般看来需要我,Vim不能仅仅解释从标签文件的排序方式的意图,但也许这不是一个广泛持有的愿望......
我不时想做的事情就是将vim命令的输出粘贴到缓冲区中.例如,当我正在编辑我的vimrc时,能够摆弄,statusline然后能够做类似于
"=set statusline?<Enter>p
Run Code Online (Sandbox Code Playgroud)
问题是,产量
E121: Undefined variable: set
E15: Invalid expression: set statusline?
Press ENTER or type command to continue
Run Code Online (Sandbox Code Playgroud)
我认为这是可能的,而且我对内置函数以及如何使用它们不够了解(我看到expand在这里和那里使用过,但在任何情况下都没有成功地使它适用于我),即使我(认为我)对正常模式有相当深刻的理解.
请注意,这个具体的例子有点人为,但我现在想不出更好的一个.对于上面的具体用例,我可以只":p获得set我在实验中使用的整个命令,然后编辑以适应,但我经常遇到其他情况,我希望vim告诉我一些事情,然后我想粘贴输出在某个地方,我可以继续看待它,同时继续我的工作.
我有一个函数,我想在Windows上的gVim中映射到Alt+ o(在Win7-x64上7.3.46 32位Bram @KIBAALE Big版本)并且它......不起作用.
我的.vimrc有一行内容如下:
nnoremap <A-o> :call SplitRelatedFile()<CR>
Run Code Online (Sandbox Code Playgroud)
然后我启动gVim,加载一个文件,点击Alt+ o然后发出一声哔哔声.我尝试在映射中使用大写字母O,我尝试了gVim中的移位和不移位,它只是不起作用,我只是发出哔哔声.(我也试过了<M-o>.)
如果我在终端中加载Vim,它会按预期工作.如果我在gVim的新实例中手动执行上面的行,它也可以按预期工作.只有当它出现在.vimrc中时才会起作用.实际上,它出现在另一个文件中,但我的_vimrc只有一行读取source x:/path/to/my.vimrc.
当我查看输出时,:map无论如何都没有将alt键列为alt键,大概是由于第8位解释导致了某些问题.不过我看到的是......
n <ef> * :call SplitRelatedFile()<CR>
Run Code Online (Sandbox Code Playgroud)
在我手动运行:nnoremapin gVim后,我看到了这一点(如果这篇文章中有任何字符翻译问题,第一行显示i-umlaut为关键字):
n ï * :call SplitRelatedFile()<CR>
n <ef> * :call SplitRelatedFile()<CR>
Run Code Online (Sandbox Code Playgroud)
所以似乎第8位在Vim(GUI)启动的不同点被不同地解释了?值得一提的是,当我:map在控制台Vim中运行时,我也得到了i-umlaut而不是<ef>行(o在ASCII中为0x6F,如果设置了高位则为0xEF,所以这很有意义; i-umlaut似乎是0x8B).
我尝试了几种不同的Alt组合键,但没有一种能够存活到gVim中,所以我很好奇是否有人有任何提示.也许我可以把它们以某种方式填入某种"延迟加载"模块,比如本地插件或其他东西?
我可以离开Alt键但是我没有功能键而且不想踩到明显的Ctrl键来实现这个功能...我刚刚发现我可以用+ ,+ <A-o>的结果替换它,这确实有效(因为我在我的vimrc中获得了i-umlaut)但这不是很好!对这种疯狂的任何想法?(哦,这对于控制台Vim不起作用,我需要在返回false 时保留版本.)CtrlvAltoAlthas("gui")
我现在已经注意到gVim和控制台Vim都将i-umlaut报告为0xEF所以...我不知道我需要做些什么来使这个更少的kludgey.请帮帮我!
谢谢你的建议.
我有一个映射,用于在一行上打印突出显示.我从其他海报中得到了这个想法,谢谢你.这是我做的:
function! PrintSyntaxItem()
let l:colorsyntax = synIDattr(synID(line("."), col("."), 0), "name")
execute "highlight" l:colorsyntax
endfunction
Run Code Online (Sandbox Code Playgroud)
我像这样映射:
nnoremap <A-s> :call PrintSyntaxItem()<CR>
Run Code Online (Sandbox Code Playgroud)
然而,当我执行它时,我得到命令行回显以及我想要的输出,这导致获得"按ENTER"提示.即在输出中我看到:
:execute "highlight" synIDattr(synID(line("."), col("."), 0), "name")
vimBracket xxx links to Delimiter
Press ENTER or type command to continue
Run Code Online (Sandbox Code Playgroud)
我想丢失:execute线路,然后按ENTER线也会消失.有没有办法做到这一点?如果我放在silent前面execute我仍然打印出那条线但输掉了highlight输出(以及按ENTER键提示),但是为了得到我想要的输出我只是在它前面加上unsilent我得到它但是......
基本上我想要抑制:execute线的回声或者在事后清除它但是我不知道如何做,拖网文件以获取关于操纵消息的信息并没有结果.
谢谢.