实现"IsProcessorFeaturePresent" C++

Realization of "IsProcessorFeaturePresent" on C++

本文关键字:C++ IsProcessorFeaturePresent 实现      更新时间:2023-10-16

帮助请从C#到C

重新制作一小部分代码
class Program
{
    static void Main(string[] args)
    {
        foreach (ProcessorFeature feature in System.Enum.GetValues(typeof(ProcessorFeature)))
        {
            System.Console.WriteLine(feature.ToString() + "t: " + IsProcessorFeaturePresent(feature));
        }
    }
    [System.Runtime.InteropServices.DllImport("Kernel32")]
    static extern bool IsProcessorFeaturePresent(ProcessorFeature processorFeature);
    enum ProcessorFeature : uint
    {
        PF_FLOATING_POINT_PRECISION_ERRATA = 0,
        PF_FLOATING_POINT_EMULATED = 1,
        PF_COMPARE_EXCHANGE_DOUBLE = 2,
        PF_MMX_INSTRUCTIONS_AVAILABLE = 3,
        PF_PPC_MOVEMEM_64BIT_OK = 4,
        PF_ALPHA_BYTE_INSTRUCTIONS = 5,
        PF_XMMI_INSTRUCTIONS_AVAILABLE = 6,
        PF_3DNOW_INSTRUCTIONS_AVAILABLE = 7,
        PF_RDTSC_INSTRUCTION_AVAILABLE = 8,
        PF_PAE_ENABLED = 9,
        PF_XMMI64_INSTRUCTIONS_AVAILABLE = 10,
        PF_SSE_DAZ_MODE_AVAILABLE = 11,
        PF_NX_ENABLED = 12,
        PF_SSE3_INSTRUCTIONS_AVAILABLE = 13,
        PF_COMPARE_EXCHANGE128 = 14,
        PF_COMPARE64_EXCHANGE128 = 15,
        PF_CHANNELS_ENABLED = 16,
        PF_XSAVE_ENABLED = 17,
        PF_SECOND_LEVEL_ADDRESS_TRANSLATION = 20,
        PF_VIRT_FIRMWARE_ENABLED = 21,
    }
}

我正在尝试创建枚举,但是编译器写入"需要标识符"。
编译器写道," winnt.h"中已经有一个定义

#define PF_FLOATING_POINT_PRECISION_ERRATA   0

我如MSDN中所述连接了库。

#include <winnt.h>
#pragma comment (lib, "Kernel32.lib")

我什至不知道在C 上如何实现" foreach"。

因为C 没有反射,因此访问枚举的名称似乎很困难。但是串起的操作员非常适合:

#define VAL_AND_NAME(x) { x, #x }
struct { int val; const char* name; } const features[] = {
    VAL_AND_NAME(PF_FLOATING_POINT_PRECISION_ERRATA),
    VAL_AND_NAME(PF_FLOATING_POINT_EMULATED),
    VAL_AND_NAME(PF_COMPARE_EXCHANGE_DOUBLE),
    VAL_AND_NAME(PF_MMX_INSTRUCTIONS_AVAILABLE),
    VAL_AND_NAME(PF_PPC_MOVEMEM_64BIT_OK),
    VAL_AND_NAME(PF_ALPHA_BYTE_INSTRUCTIONS),
    VAL_AND_NAME(PF_XMMI_INSTRUCTIONS_AVAILABLE),
    VAL_AND_NAME(PF_3DNOW_INSTRUCTIONS_AVAILABLE),
    VAL_AND_NAME(PF_RDTSC_INSTRUCTION_AVAILABLE),
    VAL_AND_NAME(PF_PAE_ENABLED),
    VAL_AND_NAME(PF_XMMI64_INSTRUCTIONS_AVAILABLE),
    VAL_AND_NAME(PF_SSE_DAZ_MODE_AVAILABLE),
    VAL_AND_NAME(PF_NX_ENABLED),
    VAL_AND_NAME(PF_SSE3_INSTRUCTIONS_AVAILABLE),
    VAL_AND_NAME(PF_COMPARE_EXCHANGE128),
    VAL_AND_NAME(PF_COMPARE64_EXCHANGE128),
    VAL_AND_NAME(PF_CHANNELS_ENABLED),
    VAL_AND_NAME(PF_XSAVE_ENABLED),
    VAL_AND_NAME(PF_SECOND_LEVEL_ADDRESS_TRANSLATION),
    VAL_AND_NAME(PF_VIRT_FIRMWARE_ENABLED),
};

现在您有了(值,名称(对的数组,您只需循环。远程语法效果很好:

char buffer[1000];
for( auto f : features ) {
    wsprintfA(buffer, "%40s : %sn",
                      f.name, IsProcessorFeaturePresent(f.val)? "true": "false");
    // write buffer to standard output or wherever you like
}
相关文章:
  • 没有找到相关文章