小编Jon*_*rdy的帖子

一种理想的编程键盘布局

我经常听到抱怨为了简洁而大量使用符号的编程语言,最明显的是C和C++(我不会触及APL),很难打字,因为它们需要经常使用shift键.一两年前,我自己厌倦了,下载了微软的键盘布局创建器,对我的布局进行了一些修改,并且没有一次回头看.速度差异惊人; 通过这些简单的更改,我能够以大约30%的速度输入C++代码,当然这取决于毛茸茸的程度; 最重要的是,我在普通运行文本中的打字速度不会受到影响.

我的问题是:编程中存在哪些备用键盘布局已经普及,其中任何一种仍然在现代使用,你个人使用任何改变的布局,我的布局如何进一步优化?

我对标准QWERTY布局进行了以下更改.(我不使用Dvorak,但有一个程序员Dvorak布局值得一提.)

  • 交换数字与顶行中的符号,因为长或重复的文字数通常被命名常量替换;
  • 使用代字号交换反引号,因为反引号在许多语言中很少见,但析构函数在C++中很常见;
  • 交换减去下划线,因为下划线在标识符中很常见;
  • 用方括号交换花括号,因为块比下标更常见; 和
  • 用单引号交换双引号,因为字符串比字符文字更常见.

我怀疑这最后可能是最有争议的,因为它通过要求使用shift来键入常见的收缩来干扰运行文本.这种布局显着提高了我在C++,C,Java和Perl中的打字速度,并且在LISP和Python中有所增加.

language-agnostic qwerty dvorak keyboard-layout

78
推荐指数
5
解决办法
6万
查看次数

实际使用dynamic_cast?

我有一个关于dynamic_cast运算符的非常简单的问题.我知道这用于运行时类型识别,即在运行时了解对象类型.但是根据您的编程经验,您能否提供一个真实场景,您必须使用此运算符?没有使用它有什么困难?

c++ casting rtti

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

std :: quick_exit和std :: abort有什么区别,为什么需要std :: quick_exit?

C++ 11引入了一种完成程序执行的新方法std::quick_exit.

引用N3242 18.5(第461页):

[[noreturn]] void quick_exit(int status) noexcept;
Run Code Online (Sandbox Code Playgroud)

效果:通过调用at_quick_exit注册的函数按其注册的相反顺序调用,除了在注册时已经调用过的任何先前注册的函数之后调用函数.对象不应因呼叫而被销毁quick_exit.如果控制离开了一个被调用的注册函数,quick_exit因为该函数没有为抛出的异常提供处理程序,则terminate()应该调用它.[注意:at_quick_exit可以从与注册函数不同的线程调用注册函数,因此注册函数不应该依赖具有线程存储持续时间的对象的标识.- 结束注释]调用注册函数后,quick_exit应调用 _Exit(status).[注意:标准文件缓冲区未刷新.见:ISO C 7.20.4.4. - 结束说明]

作为将状态传递给父进程的能力的定义std::abort(void)std::_Exit(int status)不同,它提出了我的问题.

这是否意味着在语义之间唯一的区别std::quick_exitstd::abortstd::quick_exit注册的使用调用的函数std::at_quick_exit,并允许设置返回的状态?

引入此功能的理由是什么?

c++ language-lawyer c++11

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

在C中声明64位变量

我有个问题.

uint64_t var = 1; // this is 000000...00001 right?
Run Code Online (Sandbox Code Playgroud)

在我的代码中,这有效:

var ^ (1 << 43)
Run Code Online (Sandbox Code Playgroud)

但它怎么知道1应该是64位?我不应该写这个吗?

var ^ ( (uint64_t) 1 << 43 )
Run Code Online (Sandbox Code Playgroud)

c bit-shift

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

查询gcc的-ffunction-section和-fdata-sections选项

以下在GCC页面中提到的功能部分和数据部分选项:

-ffunction-sections
-fdata-sections
Run Code Online (Sandbox Code Playgroud)

如果目标支持任意节,则将每个函数或数据项放入输出文件中的自己的部分.函数名称或数据项名称确定输出文件中节的名称.在链接器可以执行优化以改善指令空间中引用的位置的系统上使用这些选项.大多数使用ELF对象格式的系统和运行Solaris 2的SPARC处理器都具有这种优化的链接器.AIX可能会在将来进行这些优化.

只有在获得重大好处时才使用这些选项.指定这些选项时,汇编器和链接器将创建更大的对象和可执行文件,并且速度也会更慢.如果指定此选项,则无法在所有系统上使用gprof,如果同时指定了此选项和-g,则可能无法进行调试.

我的印象是这些选项有助于减少可执行文件的大小.为什么这个页面会说它会创建更大的可执行文件?我错过了什么吗?

c size optimization linker gcc

28
推荐指数
4
解决办法
3万
查看次数

如何使C++ 0x和__STRICT_ANSI__相处?

我需要popen在项目中使用,但我得到:

error: 'popen' was not declared in this scope

看起来GCC __STRICT_ANSI__在两者之下定义-std=c++0x(与我能够找到的信息相反)-std=gnu++0x,这导致popen(和_popen)被省略stdio.奇怪的是,取消定义__STRICT_ANSI__并不能解决问题,也不会向前宣布该功能.我显然错过了一些东西.有合理的解决方法吗?

我使用的是MinGW 4.5.0,并升级到4.5.2,但我仍然遇到同样的问题.我宁愿不必使用msys来编译4.6.0,但如果必须的话,我会这样做.

c++ gcc gnu mingw c++11

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

解决模板类之间的循环依赖关系

我有两个类,Foo<T>并且Bar<T>派生自Base.每个都覆盖一个方法virtual Base* convert(ID) const,其中ID是一个类型的实例,它唯一地标识Foo或的特定实例Bar(假装它是一个enum).问题是Foo::convert()需要能够返回Bar实例,同样Bar::convert()需要能够实例化Foo.由于它们都是模板,因此在Foo.h和之间产生循环依赖关系Bar.h.我该如何解决这个问题?

编辑:前向声明不起作用,因为每个方法的实现需要另一个类的构造函数:

Foo.h:

#include <Base.h>

template<class T> class Bar;

template<class T>
class Foo : public Base { ... };

template<class T>
Base* Foo<T>::convert(ID id) const {

    if (id == BAR_INT)
        return new Bar<int>(value); // Error.

    ...

}
Run Code Online (Sandbox Code Playgroud)

Bar.h:

#include <Base.h>

template<class T> class Foo;

template<class T> …
Run Code Online (Sandbox Code Playgroud)

c++ templates circular-dependency

21
推荐指数
4
解决办法
1万
查看次数

Code Golf:让我成为一个弧

挑战

按字符数计算的最短程序,接受表单的标准输入X-Y R,具有以下保证:

  • R 是小于或等于8的非负十进制数
  • XY是在十进制给定为45°的倍数(非负角度0,45,90,135,等等)
  • X 小于 Y
  • Y不是,360如果X0

并在标准输出上生成从起始角度XY半径结束角度的ASCII"弧" R,其中:

  • 弧的顶点用.表示 o
  • 的角度0180由下式表示-
  • 的角度45225由下式表示/
  • 的角度90270由下式表示|
  • 的角度135315由下式表示\
  • 由两条线包围的多边形区域填充有非空白字符.

如果给出无效输入,则程序不需要产生有意义的输出.允许使用任何语言的解决方案,当然除了专门针对此挑战而编写的语言,或者不公平地使用外部实用程序的语言.外来的水平和垂直空白允许在提供的输出的格式保持正确的输出.

开心打高尔夫!

众多例子

输入:

0-45 8

输出:

        /
       /x
      /xx
     /xxx
    /xxxx
   /xxxxx
  /xxxxxx
 /xxxxxxx …

language-agnostic geometry code-golf rosetta-stone

20
推荐指数
7
解决办法
1723
查看次数

重用,重写或重构?

在工作中,我继承了基于PHP的网站的开发之后,最初制作它的顾问得到了保护并且没有留下任何痕迹.字面上有一半的代码是从在线教程中删除的,并且有成千上万的内容,如果不完整,那么做的很少.几乎没有任何实际工作.我一直在尝试提取可用的组件,例如布局(巧妙地与代码混合),会话管理(经过精心调配的非转义,未经验证的SQL查询)以及其他一些东西,但是很难强制所有这个垃圾到位了.此外,我不会说惯用的PHP,更多的是Perl用户,而且我应该在这个项目上主要用于维护,所以重写所有内容似乎只需要将现有的怪物摔跤到位.

顺便说一句,我从来没有看到任何像这样糟糕的写作.我想,欢迎来到与其他人的代码合作的世界,但我确实希望在现实世界中拥有这样的宝石并不常见:

  • // WHY IS THIS NOT WORKING
  • // I know this is bad but were going for working stuff right now...
  • // This is a PHP code outputing Javascript code outputting HTML...do not go further
  • // Not userful

我正在寻找最好的建议.如果你在我的位置,你会怎么做?

编辑:谢谢大家,感谢您提供快速有益的建议!

php maintenance

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

在C++中使所有类型默认为常量

什么是向编译器指示的最简单和最不突兀的方式,无论是通过编译器选项,#defines,typedefs还是模板,每次我说T,我的意思是T const什么?我宁愿不使用外部预处理器.由于我不使用mutable关键字,因此可以接受重新调整以指示可变状态.

编辑:由于这个意图完全是错误的(因为我不在几个小时内澄清),让我解释一下.本质上,我只想知道在编译时可以使用哪些系统来操作类型系统.我不在乎这是否会产生非标准,错误,不可维护,无用的代码.我不打算在生产中使用它.这只是一种好奇心.

到目前为止的潜在(次优)解决方案:

// I presume redefinition of keywords is implementation-defined or illegal.
#define int int const
#define ptr * const
int i(0);
int ptr j(&i);

typedef int const Int;
typedef int const* const Intp;
Int i(0);
Intp j(&i);

template<class T>
struct C { typedef T const type; typedef T const* const ptr; };
C<int>::type i(0);
C<int>::ptr j(&i);
Run Code Online (Sandbox Code Playgroud)

c++ functional-programming const immutability language-extension

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