小编Dar*_*tom的帖子

模板专业化与函数重载

问题很简单。之间有什么区别:

template <typename T>
T add(T a, T b)
{
    return a + b;
}

template <>
int add<int>(int a, int b)
{
    return a + b; //no reason to specialize, but still...
}
Run Code Online (Sandbox Code Playgroud)

和:

template <typename T>
T add(T a, T b)
{
    return a + b;
}

int add(int a, int b)
{
    return a + b; //no reason to overload, but still...
}
Run Code Online (Sandbox Code Playgroud)

他们似乎是一样的。

c++

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

工会不重新诠释价值观吗?

考虑以下程序:

#include <stdio.h>

union myUnion
{
    int x;
    long double y;
};

int main()
{
    union myUnion a;
    a.x = 5;
    a.y = 3.2;
    printf("%d\n%.2Lf", a.x, a.y);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

-858993459
3.20
Run Code Online (Sandbox Code Playgroud)

很好,因为该int成员使用该成员的某些位进行解释long double。但是,相反实际上并不适用:

#include <stdio.h>

union myUnion
{
    int x;
    long double y;
};

int main()
{
    union myUnion a;
    a.y = 3.2;
    a.x = 5;
    printf("%d\n%.2Lf", a.x, a.y);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

5
3.20
Run Code Online (Sandbox Code Playgroud)

问题是,为什么long double不将它们重新解释为某个垃圾值(因为其字节中的4个应表示整数)?这不是巧合,程序针对的所有值输出3.20 a.x,而不仅仅是5。

c floating-point precision long-double unions

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

如何计算大n的2 ^ n?

我正在尝试编写一个程序,该程序接受一个数字n作为输入,并将2的结果输出为的幂n。问题是,n可能会很大(最多100,000个)。本质上,我正在尝试计算pow(2, n);非常大的数字。

我认为这样做的方法是将数字存储在数组中,因为没有内置的数值类型可以容纳如此大的值。

这些数字采用十进制格式(以10为基数)。

我使用的是C,而不是C ++,因此无法使用STL向量和其他C ++容器。我也不能使用外部库,例如GMP。我需要在纯C语言中手动实现该算法。

c

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

logb()和ilogb()有什么区别?

如果我理解正确,则ilogb()也会处理0NaN参数(并返回FP_ILOGB0FP_ILOGBNAN),而logb()会引发域错误。据我所知,没有理由使用logb()。这两个函数之间是否还有其他区别,是否有任何理由logb()代替ilogb()

c c++

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

rsize_t 在哪个标题中定义?

我知道,C11标准定义rsize_tsize_t在可选附件K,但在什么头文件(S)?C标准在哪里说应该定义这种类型?

c

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

索引器通过引用获取还是 get+set?

这是我的课:

class MyArray<T>
{
    private T[] data;
    public MyArray(int size)
    {
        data = new T[size];
    }
    public MyArray(in T[] array)
    {
        data = new T[array.Length];
        for (int i = 0; i < array.Length; i++)
            data[i] = array[i];
    }
    public T this[int i] //I am talking about this indexer
    {
        get => data[i];
        set => data[i] = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该像这样定义我的索引器,而不是像上面那样做吗?

public ref T this[int i]
{
    get => data[i];
}
Run Code Online (Sandbox Code Playgroud)

我应该选择哪种方法?据我所知,方法 1 允许您在设置值时执行额外的代码,但是方法 2 允许您执行类似的操作int.TryParse(str, out myArrayObj[i]);

编辑:这个问题不仅适用于索引器,而且适用于一般的任何属性。

c# c#-7.0

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

如何声明函数指针参数

这两个声明有什么区别:

double math_operation(double x, double (*func)(double));
double math_operation(double x, double func(double));
Run Code Online (Sandbox Code Playgroud)

它们似乎都在 GCC 中使用相同的调用:

math_operation(2.0, sqrt);
Run Code Online (Sandbox Code Playgroud)

它只是语法糖还是更多?

c function-pointers implicit-conversion function-declaration

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

为什么 x86 分页没有权限环的概念?

早在 1982 年,当 Intel 发布 80286 时,他们为分段方案(环 0-3)添加了 4 个特权级别,由全局描述符表 (GDT) 和本地描述符表 (LDT) 中的 2 位指定。

在 80386 处理器中,Intel 添加了分页,但令人惊讶的是,它只有 2 个权限级别(主管和用户),由页目录条目 (PDE) 和页表条目 (PTE) 中的单个位指定。

这意味着仅使用分页的操作系统(如大多数现代操作系统)无法从环 1 和环 2 的存在中受益,这对于驱动程序来说可能非常有用。(例如,Win9x 经常崩溃,因为它正在将有问题的未经检查的驱动程序加载到环 0 中)。

从可移植性的角度来看,环 1 和环 2 的存在是 x86 架构的一个怪癖,可移植操作系统不应该使用它们,因为其他架构只有 2 个特权级别。

但我确信,英特尔工程师在 1985 年设计 386 时并没有考虑到其他平台的可移植性。

那么为什么英特尔不允许分页有 4 个权限级别,比如分段?

paging privileges x86 operating-system cpu-architecture

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

在 Windows 中使用 ld 链接程序集

我有这个“你好世界!” 用汇编编写的程序(NASM 语法):

; hello.asm
global _start

extern GetStdHandle
extern WriteFile

section .text
_start:
    push dword -11
    call GetStdHandle
    sub esp, 4
    mov ebx, esp
    push dword 0
    push ebx
    push message_length
    push message
    push eax
    call WriteFile
    add esp, 4
    xor eax, eax
    ret

section .data
    message: db `Hello world!\r\n`
    message_length equ $ - message
Run Code Online (Sandbox Code Playgroud)

我尝试将目标文件与 MinGW 链接,ld但我无法让它工作:

nasm -f win32 hello.asm -o hello.obj
ld -mi386pe hello.obj -o hello.exe -lkernel32
Run Code Online (Sandbox Code Playgroud)

的输出ld是:

ld: cannot find -lkernel32 …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm ld

5
推荐指数
0
解决办法
60
查看次数

GCC 不符合?

我知道很少有编译器真正支持 C11 线程(这很可悲,但无论如何)。C11 标准要求不支持线程的实现定义__STDC_NO_THREADS__. 然而这个程序似乎给出了一个错误:

#include <stdio.h>
#ifndef __STDC_NO_THREADS__
    #include <threads.h> //error is here
#endif // __STDC_NO_THREADS__

int main(void)
{
    #ifdef __STDC_NO_THREADS__
        printf("There are no threads");
    #else
        printf("There are threads");
    #endif // __STDC_NO_THREADS__
}

//Error at line 3: fatal error: threads.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)

编译器版本是 GCC 9.2.0 (Windows 10 x64),带有__STDC_VERSION__= 201710L(所以它是 C17)。如果你不知道,问题是我的编译器没有定义__STDC_NO_THREADS__or <threads.h>,这不符合 C11。可能是什么问题?

c multithreading c11

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

如何从 Win32 C++ 应用程序输出到父控制台窗口?

我有一个 WinAPI/Win32 应用程序。如果我在从命令提示符运行时尝试使用 cin/cout/cerr,它不起作用。我尝试将项目类型从 Windows 应用程序切换到控制台应用程序,但问题是当我通过双击可执行文件正常运行它时会出现一个控制台窗口。

所以我的问题是:有什么方法可以在 Win32 应用程序中将 cin/cout/cerr 与父(调用)控制台窗口一起使用?(如果参数/c或被/?传递,我只想要这种行为,所以如果它不带参数被调用,那么无论它应该启动GUI)。

c++ winapi cmd

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