C语言宏替换的注意事项

这篇具有很好参考价值的文章主要介绍了C语言宏替换的注意事项。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先思考一个问题:

#include <string>
#include <Windows.h>

namespace ui {
int MessageBox(HWND hwnd, const std::wstring &text, const std::wstring &caption,
               UINT flags) {
  UINT actual_flags = flags;

  const wchar_t *text_ptr = text.c_str();
  const wchar_t *caption_ptr = caption.c_str();

  return ::MessageBox(hwnd, text_ptr, caption_ptr, actual_flags);
}
} // namespace ui

int test_ui_message_box() {
  ui::MessageBox(0, L"33333", L"", MB_OK);
  ui::MessageBoxW(0, L"33333", L"", MB_OK);
  ui::MessageBoxA(0, L"33333", L"", MB_OK);
  ui::MessageBoxB(0, L"33333", L"", MB_OK);
  return 0;
}

上面test_ui_message_box函数中调用的4个函数能编译通过吗?

答案:

ui::MessageBox(0, L"33333", L"", MB_OK); // 编译成功

ui::MessageBoxW(0, L"33333", L"", MB_OK);// 定义了UNICODE宏时可以编译成功

ui::MessageBoxA(0, L"33333", L"", MB_OK);// 没有定义UNICODE宏时可以编译成功

ui::MessageBoxB(0, L"33333", L"", MB_OK);// 编译失败

为什么会问这个问题?

因为最近在chromium项目中笔误写了一个代码,把系统MessageBox调整为ui命名空间的MessageBox,代码修改如下:

::MessageBoxW   ===>  ui::MessageBoxW

chromium源码如下:

C语言宏替换的注意事项,c语言,开发语言

 但是通过上面的定义可以看到,ui命名空间里没有MessageBoxW函数,所以上面我是写了一个笔误,但是竟然编译通过了

所以,引起了我的兴趣:

一个小工具来辅助排查:

VC中如何查看预编译的结果 .i文件:VC中如何查看预编译的结果 .i文件_预处理文件.i怎么看_程序猿-小斑的博客-CSDN博客

C语言宏替换的注意事项,c语言,开发语言

即编译cpp文件时使用/P命令行,可以看到预处理之后的真实文件内容。

上面代码的编译结果:(定义了UNICODE宏)

C语言宏替换的注意事项,c语言,开发语言

在定义了UNICODE宏之后,ui命名空间的真实函数名称就是 MessageBoxW,而且调用ui::MessageBox 函数的地方也被替换成了 ui::MessageBoxW。

这两个地方的名称是被系统全局的宏定义替换之后的结果:

C语言宏替换的注意事项,c语言,开发语言C语言宏替换的注意事项,c语言,开发语言C语言宏替换的注意事项,c语言,开发语言

google code style中对使用宏的建议:

Google C++ Style Guide

C语言宏替换的注意事项,c语言,开发语言C语言宏替换的注意事项,c语言,开发语言

 文章来源地址https://www.toymoban.com/news/detail-606259.html

到了这里,关于C语言宏替换的注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Docker】 Docker 开发注意事项

    在使用 Docker 进行开发时,需要注意以确保开发过程顺利和高效: 1. 了解 Docker 基础:在开始之前,了解 Docker 的基本概念,如镜像(Images)、容器(Containers)、仓库(Repositories)和 Dockerfile 的基本语法。 2. 编写清晰的 Dockerfile:Dockerfile 应该清晰、简洁,并且易于理解。确保

    2024年02月03日
    浏览(19)
  • C语言中各变量声明及注意事项

    在C语言中,变量的声明语句用于告诉编译器该变量的类型、名称以及存储类型等信息。以下是C语言中常见的变量声明语句及其使用规则: 整型(int):用于声明整数类型的变量,例如: int num; 浮点型(float):用于声明单精度浮点数类型的变量,例如: float pi = 3.14; 字符型

    2024年01月19日
    浏览(37)
  • [游戏开发][虚幻5]新建项目注意事项

    鼠标右键点击Client.uproject文件,可以看到三个比较关键的选项, 启动游戏, 生成sln解决方案, 切换引擎版本 断点调试 C++代码重要步骤 如果你想断点调试C++代码,则必须使用使用代码编译启动引擎,你需要做几个操作 1:把你的游戏作为启动项。如果你不设置,则默认打开

    2024年02月22日
    浏览(23)
  • C语言嵌入式系统编程注意事项之内存操作

    在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力 数据指针 在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言

    2024年02月09日
    浏览(32)
  • Go语言中的init函数: 特点、用途和注意事项

    在Go语言中, init() 函数是一种特殊的函数,用于在程序启动时自动执行一次。它的存在为我们提供了一种机制,可以在程序启动时进行一些必要的初始化操作,为程序的正常运行做好准备。 在这篇文章中,我们将详细探讨 init() 函数的特点、用途和注意事项,希望能帮助你更

    2024年02月08日
    浏览(26)
  • RabbitMQ基本使用及企业开发中注意事项

    目录 一、基本使用 二、使用注意事项 1. 生产者重连机制 - 保证mq服务是通的 2. 生产者确认机制 - 回调机制 3. MQ的可靠性 4. Lazy Queue模式 5. 消费者确认机制 部署完RabbitMQ有两种使用方式: 网页客户端 Java代码 MQ组成部分: 虚拟主机 - 进行数据隔离的,好比mysql中的不同数据库

    2024年04月26日
    浏览(23)
  • Unity3D开发流程及注意事项

    使用Unity3D开发游戏需要遵循一定的流程和注意事项,以确保项目的顺利进行并获得良好的结果。以下是一般的游戏开发流程以及一些注意事项,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 游戏开发流程: 1.概念和计划阶段

    2024年02月09日
    浏览(22)
  • 【C语言初阶篇】 while 语句的语法和注意事项 (详解版)

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,又是新的一天开始了,今天给大家带来的循环语句的全面讲解!    ⛳️ 历时一天终于给肝出来了,本文详细讲解了wh

    2024年02月14日
    浏览(22)
  • 计算机二级C语言的注意事项及相应真题-5-程序修改

    给定程序modi1.c的主函数中,将a、b、c三个结点链成一个单向链表,并给各结点的数据域赋值,函数fun()的作用是:累加链表结点数据域中的数据作为函数值返回。 请改正函数fun中指定部位的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改

    2024年02月21日
    浏览(18)
  • 设计模式: 软件设计的分层与软件开发注意事项

    软件设计的分层 系统级设计架构 应用级架构 模块级架构 代码级架构 1) 系统级设计架构 应用在整个系统内,如与后台服务如何通信,与第三方系统如何集成 包括业务的关系和协作的机制 设计后端:与后台数据传递的机制 包括:api设计规则,访问授权的一个开放标准(OAuth

    2024年02月07日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包