的C99标准文档具有相关的##预处理运算的部分下面的例子:
在以下片段中:
Run Code Online (Sandbox Code Playgroud)#define hash_hash # ## # #define mkstr(a) # a #define in_between(a) mkstr(a) #define join(c, d) in_between(c hash_hash d) char p[] = join(x, y); // equivalent to // char p[] = "x ## y";
扩张在不同阶段产生:
Run Code Online (Sandbox Code Playgroud)join(x, y) in_between(x hash_hash y) in_between(x ## y) mkstr(x ## y) "x ## y"
换句话说,扩展hash_hash会产生一个新的令牌,由两个相邻的尖锐符号组成,但这个新令牌不是##运算符.
我不明白为什么hash_hash的替换产生##而不是"##"或"#""#".在双哈希播放之前和之后单个哈希有什么作用?
任何回复都非常感谢.
我有一个类似于这个的真实世界程序,我将称之为test.cpp
:
#include <stdlib.h>
extern void f(size_t i);
int sample(size_t x)
{
size_t a = x;
size_t i;
for (i = a-2; i>=0; i--) {
f(i);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我是一个无限循环.
如果我运行以下命令:
g++ -S -o test.s test.cpp
Run Code Online (Sandbox Code Playgroud)
我得到以下装配顺序:
.file "test.cpp"
.text
.globl _Z6samplem
.type _Z6samplem, @function
_Z6samplem:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $32, %rsp
movq %rdi, -24(%rbp)
movq -24(%rbp), %rax
movq %rax, -8(%rbp)
movq -8(%rbp), %rax
subq $2, %rax
movq %rax, …
Run Code Online (Sandbox Code Playgroud) 如何作为类变量安装包含方法入口点的表?
为了澄清,请考虑以下工作代码:
class A(object):
def go(self, n):
method = self.table[n]
method(self)
def add(self):
print "add"
def multiply(self):
print "multiply"
table = {
1: add,
2: multiply,
}
>>> q = A()
>>> q.go(1)
add
Run Code Online (Sandbox Code Playgroud)
但是,我不喜欢它.我想在开头提供表格以便于阅读(真实世界的项目要大得多),我不喜欢使用它method(self)
.我认为这很令人困惑.
我的问题是:有更好的方法还是上面的代码点?
谢谢.