小编Dea*_*n P的帖子

允许静态声明后跟非静态声明的基本原理,反之亦然

此代码将编译并在当前 C 标准下定义良好:

static int foo(int);
extern int foo(int);
Run Code Online (Sandbox Code Playgroud)

该标准规定,在这种情况下(C11:6.2.2 标识符的链接(p4)):

对于在该标识符的先前声明可见的范围内使用存储类说明符 extern 声明的标识符,31) 如果先前声明指定内部或外部链接,则后面声明中标识符的链接与先前声明中指定的链接。[...]

...这意味着该int foo(int)函数已声明static int foo(int)

像这样交换这些声明:

extern int foo(int);
static int foo(int);
Run Code Online (Sandbox Code Playgroud)

...使用 GNU GCC 给我一个编译器错误:

'foo' 的静态声明遵循非静态声明

我的问题是:第二种情况是一个错误并且没有以与第一种情况类似的方式处理的设计原理是什么?我怀疑这与单独的翻译单元更易于管理和#include? 我觉得如果不理解这一点,我可以在未来的 C 项目中为一些错误敞开心扉。

c static declaration extern

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

x86-64 零标志在内联调用之间清除(和另一个问题)

我正在使用此处bsf找到的英特尔开发人员手册第 210 页上的x86-64 指令。本质上,如果找到最低有效位 1,则将其位索引存储在目标操作数中。

此外,如果所有源操作数为 0,则 ZF 标志设置为 1;否则,ZF 标志被清除。

我正在使用内联 x86-64 汇编指令编译我的 C 代码。我已经定义了一个调用bsf指令的 C 函数:

uint64_t bitScanForward(T_bitboard b) {
    __asm__(
       "bsf %rcx,%rax\n"
       "leave\n"
       "ret\n"
    );
}
Run Code Online (Sandbox Code Playgroud)

还有另一个 C 函数,它检查标志寄存器中 ZF 位的状态:

uint64_t isZFSet() {
    printf("\n"); <- This is another problem I am having (see below)...
    __asm__(
        "jz true\n"
        "movq $0,%rax\n"//return false
        "jmp end\n"
        "true:\n"
        "movq $1,%rax\n"//return true
        "end:\n"
        "leave\n"
        "ret\n"
    );
}
Run Code Online (Sandbox Code Playgroud)

我已经对这些进行了测试,发现即使将 bsf 命令应用于数字零,ZF 标志也始终被清除,这似乎违反了规范。

//Calling function...
//Do stuff...
bitScanForward(0ULL);//ULL is …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly gcc inline-assembly

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

如何使用 .NET 内置 DI 容器“向下许多级别”配置依赖项注入

我有一个控制台 .NET 核心应用程序,它使用该Microsoft.Extensions.DependencyInjection库作为依赖项注入框架。

我想使用这个框架来注入一个“向下”两个级别的依赖项,而不必在中间层多余地提及这个依赖项。我该怎么做呢?

目前,我注入依赖项的唯一方法是将其向下传递,直到需要为止。这是我的独立控制台应用程序,它演示了该要求。它是一个简单的程序,可以根据示例资产和负债金额计算一个人的净资产。(它实际上只是减去两个金额)。

Program.cs文件包含程序主入口点并注册依赖项。

程序.cs:

public class Program
{
    private static IServiceProvider _serviceProvider;
    public static void Main(string[] args)
    {
        RegisterServices();
        IServiceScope scope = _serviceProvider.CreateScope();
        scope.ServiceProvider.GetRequiredService<ConsoleApplication>().Run();
        DisposeServices();
    }

    private static void RegisterServices()
    {
        var services = new ServiceCollection();
        services.AddSingleton<ICalculator, Calculator>();
        services.AddSingleton<ConsoleApplication>();
        _serviceProvider = services.BuildServiceProvider(true);
    }

    private static void DisposeServices()
    {
        if (_serviceProvider == null)
        {
            return;
        }
        if (_serviceProvider is IDisposable)
        {
            ((IDisposable)_serviceProvider).Dispose();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

设置依赖项注入后,Program.cs运行该ConsoleApplication.cs Run方法。

ConsoleApplication.cs:

internal class …
Run Code Online (Sandbox Code Playgroud)

c# design-patterns dependency-injection di-containers .net-core

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