这是一个简单的函数delcared并使用旧样式语法定义:
#include <stdio.h>
void
error(message,a1,a2,a3,a4,a5,a6,a7)
char *message;
char *a1,*a2,*a3,*a4,*a5,*a6,*a7;
{
fprintf(stderr,message,a1,a2,a3,a4,a5,a6,a7);
}
int main ()
{
error("[ERROR %d]: %s.\n",110,"Connection timed out");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它可以编译并正确运行以进行打印:
[ERROR 110]:连接超时.
我读到这个样式没有相关的原型,但是如何在运行时自动将int转换为char*,甚至提供的参数少于声明的参数?
对于unsigned int x,是否可以仅使用以下运算符(加上没有循环,分支或函数调用)来计算x%255(或者通常为2 ^ n - 1)?
!
,~
,&
,^
,|
,+
,<<
,>>
.
为什么某些struct使用单个元素数组,如下所示:
typedef struct Bitmapset
{
int nwords;
uint32 words[1];
} Bitmapset;
Run Code Online (Sandbox Code Playgroud)
为了方便后者的动态分配?
我试图了解GAS的.code16的行为.从手册中可以看出,在16位部分中,对于32位操作数或指令,将为指令编码生成66H操作数覆盖前缀.这是什么意思
.code16
movw %eax, %ebx
Run Code Online (Sandbox Code Playgroud)
在这种模式下合法吗?那么代码不能在16位处理器上运行?
我为其值类型定义了一个带有模板的Node类
template<class T>
class Node {
T val;
public:
Node (T & v) : val (v) {}
...
void print() { cout << v << endl; }
}
Run Code Online (Sandbox Code Playgroud)
大多数情况下,感兴趣的节点值将是一个对象类class Foo
.在这种情况下,使用Node<Foo *>
会更方便.但也可能是节点将保持原始时间int
.然后使用Node<int>
就足够了.
问题是,根据是否T
是指针类型,某些函数可能需要表现不同.例如,print
应该cout << *v
在何时以及cout << v
其他方面.
我试过的是定义两者:
template<class T>
class Node {
T val;
public:
Node (T & v) : val (v) {}
...
void print() { cout << v << endl; }
} …
Run Code Online (Sandbox Code Playgroud) 我很惊讶string plus boolean有类似三元操作的效果:
int apple = 2;
printf("apple%s\n", "s" + (apple <= 1));
Run Code Online (Sandbox Code Playgroud)
如果apple <= 1
,它将打印苹果.为什么这样做?
例如,选项数组是:
static struct option const long_options[] =
{
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'v'},
{0, 0, 0, 0}
};
Run Code Online (Sandbox Code Playgroud)
是填充吗?
我知道它使用物理地址=段寄存器<< 4 +偏移寄存器.虽然这两个寄存器是16位,8086如何处理20位加法操作?
Python是否禁止print
在类方法名称中使用(或其他保留字)?
$ cat a.py
import sys
class A:
def print(self):
sys.stdout.write("I'm A\n")
a = A()
a.print()
Run Code Online (Sandbox Code Playgroud)
$ python a.py
File "a.py", line 3
def print(self):
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
更改print
为其他名称(例如aprint
)不会产生错误.如果有这样的限制,我会感到惊讶.在C++或其他语言中,这不会是一个问题:
#include<iostream>
#include<string>
using namespace std;
class A {
public:
void printf(string s)
{
cout << s << endl;
}
};
int main()
{
A a;
a.printf("I'm A");
}
Run Code Online (Sandbox Code Playgroud) 编译使用旧样式函数定义的ac文件时
int foo(a)
int a;
{
...
}
Run Code Online (Sandbox Code Playgroud)
g ++将给出错误:'a'未在此范围内声明.gcc可以解析这个.有没有办法让g ++认识到这一点?
这对我来说是一个问题,因为我正在编译c和c ++文件的混合.一个相关的问题是构建这种混合源的标准做法是什么?在所有文件或仅cc文件上运行g ++?前者很方便但是由于c和c ++规范之间的不一致而不断给我带来麻烦(例如,char [4] ="four";)
我正在尝试使用内联汇编的示例:http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html 但是有些事让我感到困惑:
"好吧,当GCC能够确切地知道你之前和之后对寄存器做了什么时,这确实很有帮助......如果你告诉它将(x + 1)放入寄存器中,它甚至足够聪明. ,如果你没有破坏它,后来C代码引用(x + 1),并且它能够保持该寄存器空闲,它将重用计算.哇."
关于clobber列表的教程中存在一些不一致:
对于输入/输出列表中指定的寄存器,不需要将它们放入clobber列表中,因为GCC知道; 但是在关于rep_movsl(或rep_stosl)的示例中:
asm("cld \n\t""rep \n\t""stosl":/*无输出寄存器*/:"c"(计数),"a"(fill_value),"D"(dest):" %ecx","%edi");
虽然"S,D,c"在输出操作数中,但它们再次被列为破坏.我在C中尝试了一个简单的片段:
#include<stdio.h>
int main()
{
int a[] = {2, 4, 6};
int b[3];
int n = 3;
int v = 12;
asm ("cld\n\t"
"rep\n\t"
"movsl"
:
: "S" (a), "D" (b), "c" (n)
: );
// : "%ecx", "%esi", "%edi" );
printf("%d\n", b[1]);
}
Run Code Online (Sandbox Code Playgroud)
如果我使用评论的clobber列表,GCC会抱怨:
ac:8:3:错误:在重新加载'asm'ac时,无法在类'CREG'中找到寄存器:8:3:错误:'asm'操作数有不可能的约束
如果我使用空的clobber列表,它将编译并输出为4.