小编Oxd*_*eef的帖子

旧式C函数声明

这是一个简单的函数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*,甚至提供的参数少于声明的参数?

c coding-style runtime function

16
推荐指数
2
解决办法
2万
查看次数

是否可以使用按位运算符和受限运算符重写模数(2 ^ n - 1)

对于unsigned int x,是否可以仅使用以下运算符(加上没有循环,分支或函数调用)来计算x%255(或者通常为2 ^ n - 1)?

!,~,&,^,|,+,<<,>>.

c bit-manipulation modulo

11
推荐指数
1
解决办法
1370
查看次数

struct中的一个元素数组

为什么某些struct使用单个元素数组,如下所示:

typedef struct Bitmapset
{
 int nwords;
 uint32 words[1];
} Bitmapset;
Run Code Online (Sandbox Code Playgroud)

为了方便后者的动态分配?

arrays struct element

9
推荐指数
2
解决办法
7061
查看次数

操作数大小前缀为16位模式

我试图了解GAS的.code16的行为.从手册中可以看出,在16位部分中,对于32位操作数或指令,将为指令编码生成66H操作数覆盖前缀.这是什么意思

.code16
movw %eax, %ebx
Run Code Online (Sandbox Code Playgroud)

在这种模式下合法吗?那么代码不能在16位处理器上运行?

overriding 16-bit operand

7
推荐指数
1
解决办法
3834
查看次数

具有指针类型和常规类型的类模板

我为其值类型定义了一个带有模板的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)

c++ templates pointers

7
推荐指数
1
解决办法
2万
查看次数

const string加上布尔值在C中复数

我很惊讶string plus boolean有类似三元操作的效果:

int apple = 2;                                                                      
printf("apple%s\n", "s" + (apple <= 1));
Run Code Online (Sandbox Code Playgroud)

如果apple <= 1,它将打印苹果.为什么这样做?

c string boolean plural

6
推荐指数
1
解决办法
118
查看次数

为什么struct option array在使用getopt_long时需要一个addtional dummy条目

例如,选项数组是:

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)

是填充吗?

c getopt-long option

5
推荐指数
1
解决办法
1240
查看次数

cpu如何在实模式下计算20位地址

我知道它使用物理地址=段寄存器<< 4 +偏移寄存器.虽然这两个寄存器是16位,8086如何处理20位加法操作?

x86 real-mode memory-address

5
推荐指数
1
解决办法
2219
查看次数

在Python中使用print作为类方法名称

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)

python printing reserved

2
推荐指数
1
解决办法
1009
查看次数

使用g ++编译K&R样式函数定义

编译使用旧样式函数定义的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";)

c c++ kernighan-and-ritchie

1
推荐指数
2
解决办法
2068
查看次数

rep_movsl的Clobber列表

我正在尝试使用内联汇编的示例:http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html 但是有些事让我感到困惑:

  • 关于clobber的行为
    Clobbering实质上告诉GCC不信任指定寄存器/存储器中的值.

    "好吧,当GCC能够确切地知道你之前和之后对寄存器做了什么时,这确实很有帮助......如果你告诉它将(x + 1)放入寄存器中,它甚至足够聪明. ,如果你没有破坏它,后来C代码引用(x + 1),并且它能够保持该寄存器空闲,它将重用计算.哇."

这一段是否意味着clobbering将禁用常见的子表达式消除?

  • 关于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.

c x86 assembly gcc inline-assembly

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