关于VC预定义常量_WIN32,WIN32,_WIN64

2023-10-09 14:33
文章标签 预定 常量 win32 win64 vc

本文主要是介绍关于VC预定义常量_WIN32,WIN32,_WIN64,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VC2012 下写 Windows 时,有时需要判断编译环境。在之前的文章《 判断程序是否运行在 Windows x64 系统下。》里说过如何在运行期间判断系统环境,但在编译时如何判断?

MSDN 里说,VC 有 3 个预处理常量,分别是 _WIN32,_WIN64,WIN32。这三个常量如何使用呢?看起来简单,其实是很困惑的。

在 Win32 配置下, WIN32 在“项目属性-C/C++-预处理器-预处理器定义 ”里声明了,而在 x64 配置下,这个常量并不在项目预定义列表中。这是否说明可以根据 WIN32 来判断是否在 x64 平台呢?不。在 Windows SDK 的 minwindef.h 下第 37 行有如下定义:

#ifndef WIN32 #define WIN32 #endif


即是说, 只要包含了 Windows.h,那么 WIN32 常量是肯定定义了的,所以不能用于判断平台环境。但是如果在预处理定义里删掉 WIN32,又不包含 Windows.h,那么 WIN32 未定义。

下面看 _WIN32 和 _WIN64,这两个比较特别,没有任何显式定义。在 Windows.h 里没有,在 “项目属性-C/C++-预处理器-预处理器定义 ”下也没有。根据 MSDN,这是由编译器(ml.exe/ml64.exe)内部定义的。具体描述是

  _WIN32:Defined for applications for Win32 and Win64. Always defined.

_WIN64: Defined for applications for Win64.

下面看一段程序:(分别在 Win32 和 x64 配置下运行一次)

#include <iostream> using namespace std; int main() { #ifdef _WIN64 cout << "_WIN64 is defined as " << _WIN64 << endl; #endif #ifdef _WIN32 cout << "_WIN32 is defined as " << _WIN32 << endl; #endif cin.get(); return 0; }


在 Win32 配置下,_WIN32 有定义,_WIN64 没有定义。在 x64 配置下,两者都有定义。即 在 VC 下,_WIN32 一定有定义

因此,WIN32/_WIN32 可以用来判断是否 Windows 系统(对于跨平台程序),而 _WIN64 用来判断编译环境是 x86 还是 x64。最后附一个表:

常量\定义预定义选项Windows.hVC编译器
WIN32Win32√(minwindef.h) ×
_WIN32××
_WIN64××x64
转自: http://fenying.blog.163.com/blog/static/1020559932013725111743857/

这篇关于关于VC预定义常量_WIN32,WIN32,_WIN64的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/173504

相关文章

VC网络协议

// PCControlDlg.cpp : 实现文件//#include "stdafx.h"#include "PCControl.h"#include "PCControlDlg.h"#include "afxdialogex.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框#ifde

Win32函数调用约定(Calling Convention)

平常我们在C#中使用DllImportAttribute引入函数时,不指明函数调用约定(CallingConvention)这个参数,也可以正常调用。如FindWindow函数 [DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)]public static extern IntPtr FindWindow

VC环境下字符串转整型最终版

剑指Offer 字符串转化为整型 今天闲来无事,就搜了下这方面的知识,结果发现,这个题就是一个经典的算法题,在剑指Offer里已经详细分析了 直接上代码了,运行可靠,如果大家继续深入理解的话,参考这本书:《剑指Offer——名企面试官精讲典型编程题》 博主:http://blog.csdn.net/cadcisdhht/article/details/36875535 ---------

VC环境下window网络程序:UDP Socket程序

最近在学Windows网络编程,正好在做UDPsocket的程序,贴上来: 服务器框架函数:              socket();    bind();    recfrom();  sendto();  closesocket(); 客户机框架函数:            socket();      recfrom();  sendto();  closesocket();

VC环境下整型转换为字符串型(2)

在串口下位机的发送中,可能会用到需要发送数字,显示为字符串型的 和上一篇文字《串口中字符串转换为整型》一正一反,知识点学习会了: #include<iostream.h> #include <stdio.h> #include <string.h>   void inttostr(int m,unsigned char * str) { int length=0;   int tmp,te

从零开始学习JVM(七)- StringTable字符串常量池

1 概述 String应该是Java使用最多的类吧,很少有Java程序没有使用到String的。在Java中创建对象是一件挺耗费性能的事,而且我们又经常使用相同的String对象,那么创建这些相同的对象不是白白浪费性能吗。所以就有了StringTable这一特殊的存在,StringTable叫做字符串常量池,用于存放字符串常量,这样当我们使用相同的字符串对象时,就可以直接从StringTable

New的VC编译器实现

当我们调用 new 的时候,例如 int *p = new int; 时,编译器到底作了什么工作呢?跟进断点看一看。   (在 vc debug模式下 ) double *p1 = new double ; 00411A6E  push        8    00411A70  call        operator new (4111B8h) 00411A75  add

[VC] Visual Studio中读写权限冲突

前置场景: 编译没有报错,但是运行提示 内存异常: 情景1: 如下代码运行异常,提示引发了异常:写入权限冲突。*** 是 0xFFFFF..... char* str = (char*)malloc(10);str[0] = 0x30;  解决方案:要包含头文件<stdlib.h>  情景2: 在FileA文件调用FileB文件的函数,但是在FileA中却没有声明该B函数的原型

Java之常量的概念

Java之常量的概念 零基础学Java什么是常量常量的分类了解下常量池动动手练习题 零基础学Java Java学习交流 : V:study_51ctofx 什么是常量 常量:程序运行中,固定不变的量 两种表现形式: 字面常量和final修饰的常量 public static void main(String[] args){//其中 1 为字面常量,固定不变的量int

【Java String】简述String类比较和常量池内存分析

一、引出正题 String 类型对象进行比较时,我们一般使用 equals() 的方式进行值比较,但是有时候可能会出现 == 对象比较的方式。 在使用 == 比较的时候,往往是和String在JVM内存存储结构有关,这也引起了部分同学使用时的错误,那么接下来我们来详细分析一下此问题。 二、举例说明 1、new String("xx")都是在堆上创建字符串对象。当调用 intern() 方