首页 > 编程语言 >在C++中,预处理器提供了一些符号和运算符,这些符号在宏定义中有特殊的含义

在C++中,预处理器提供了一些符号和运算符,这些符号在宏定义中有特殊的含义

时间:2023-12-12 15:23:23浏览次数:39  
标签:__ std SimpleFormatItem format 符号 C++ 运算符 pragma define


在C++中,预处理器提供了一些符号和运算符,这些符号在宏定义中有特殊的含义。

以下是一些常见的符号:

#:字符串化运算符,用于将宏参数转换为字符串。

#define STRINGIZE(x) #x
std::cout << STRINGIZE(Hello); // 输出 "Hello"

##:连接运算符,用于连接两个标记,使它们成为一个标记。

#define CONCAT(a, b) a##b
int ab = CONCAT(3, 4); // 定义 int ab34;

__VA_ARGS__:可变参数宏的占位符,用于表示可变数量的参数。

#define LOG(format, ...) printf(format, __VA_ARGS__)
LOG("Hello %s!\n", "World"); // 输出 "Hello World!"

defined:用于检查宏是否已定义。

#ifndef MY_MACRO
#define MY_MACRO
#endif

#pragma:指令,用于向编译器发出特定的命令。

#pragma once

#ifdef#ifndef:条件编译指令,用于检查宏是否已定义。

#ifdef DEBUG
// 在调试模式下的代码
#endif

#elif#else:条件编译的分支指令,用于提供多个条件选择。

#ifdef DEBUG
// 调试模式下的代码
#else
// 非调试模式下的代码
#endif

#pragma message:生成编译时的消息。

#pragma message("This is a compile-time message")

#define#undef:定义和取消定义宏。

#define MY_MACRO
#undef MY_MACRO

#error:生成编译时错误消息。

#ifdef OLD_VERSION
#error "This version is no longer supported."
#endif

#pragma pack:用于设置结构体的对齐方式。

#pragma pack(push, 1)
struct MyStruct {
    char a;
    int b;
};
#pragma pack(pop)

__FILE____LINE__:分别表示当前源文件和当前行数。

#define LOG_ERROR(message) \
    std::cerr << "Error in file " << __FILE__ << " at line " << __LINE__ << ": " << message << std::endl;

 

 

一个宏定义的示例:

// test1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <functional>
#include <map>
#include <string>

// A simple FormatItem class for demonstration purposes
class SimpleFormatItem {
public:
    using ptr = std::shared_ptr<SimpleFormatItem>;

    SimpleFormatItem(const std::string& format) : format_(format) {}

    void print() const {
        std::cout << "Formatted output: " << format_ << std::endl;
    }

private:
    std::string format_;
};

// Define a map similar to the provided example
static std::map<std::string, std::function<SimpleFormatItem::ptr(const std::string& str)>> s_simple_format_items = {
#define SIMPLE_FORMAT(str, C) \
        {#str, [](const std::string& fmt) { return SimpleFormatItem::ptr(new C(fmt));}}

    SIMPLE_FORMAT(a, SimpleFormatItem),
    SIMPLE_FORMAT(b, SimpleFormatItem),
    SIMPLE_FORMAT(c, SimpleFormatItem),
#undef SIMPLE_FORMAT
};

int main() {
    // Example usage
    auto itemA = s_simple_format_items["a"]("Sample A");
    itemA->print();

    auto itemB = s_simple_format_items["b"]("Sample B");
    itemB->print();

    return 0;
}

 

标签:__,std,SimpleFormatItem,format,符号,C++,运算符,pragma,define
From: https://www.cnblogs.com/music-liang/p/17896999.html

相关文章

  • C++调用opencv和windows api完成桌面窗口截图——以梦幻西游为例
    目录程序简介程序/数据集下载代码环境、文件结构代码分析结果展示程序简介项目编写的C++程序,根据输入的字符串,遍历所有桌面窗口标题,查找包含该标题的窗口,对该桌面窗口进行截图,以梦幻西游为例输入:桌面窗口包含的字符串比如输入“梦幻”,程序就会截取桌面“梦幻西游”的窗口输......
  • C++ 用 std::get<> 访问元组
     C++ 用std::get<>访问元组 #include<iostream>#include<tuple>intmain(){//Creatingatuplestd::tuple<int,double,std::string>myTuple(42,3.14,"Hello");//Accessingelementsusingstd::get<>......
  • C++(using namespace std;)
    usingnamespacestd;是C++中的一条指令,用于指示编译器使用标准命名空间std中的所有标识符。这意味着在代码中可以直接使用标准库中的各种类、函数和对象,而无需在每个标识符前面添加std::前缀。以下是关于这条指令的一些解释:using关键字:using是一个关键字,用于创建别......
  • C++连点器
     功能这个连点器可以提升你的CPS值,它可以让你的每一次点击变成好多次,左键右键均可。 要求它调用了"windos.h"函数库(Windows系统自带函数库)以及"bits/stdc++.h"函数库(C++拓展函数),若无法使用"bits.stdc++.h"函数库的,可以将其替换为"iostream.h"函数库和"cstdio.h"......
  • C++(std::vector)
    这段代码定义了一个std::vector对象,该对象的元素类型为float。std::vector是C++标准库中的动态数组容器,可以存储多个元素,并且大小可以动态调整。std::vector<float>具体解释如下:std::vector:这是C++标准库中的一个模板类,用于实现动态数组。std::vector是一个模板类,......
  • C++( get()方法、->、*)
    在C++中,指针是一种强大的工具,用于处理内存和访问数据。以下是一些与指针相关的基本概念和操作符:解引用运算符*:用于访问指针指向的内存地址处的值。例如,如果有一个指针int*ptr,则*ptr将返回指针所指向地址的整数值。intx=10;int*ptr=&x;std::cout<<*ptr;/......
  • 《Function Programming in C++》
    说明《FunctionalProgramminginC++》书中代码练习测试以及一些笔记,部分代码需要用到C++20可以使用在线编译器编译代码地址:https://coliru.stacked-crooked.com/或者自己编译gcc-11.2及以上版本安装1介绍1.1什么是函数式编程用常用的函数范式模板代替一些循环等,比如std......
  • Unreal C++自定义Actor设置StaticMesh和Material
    1.新建第三人称c++游戏(其它模板开局也可以的)2.新建继承自Actor的c++类3.添加静态网格体成员SM_MyActor,并在构造函数中进行相应的初始化UCLASS()classMYPROJECT9S_APIAMyActor:publicAActor{GENERATED_BODY()protected:/**Pleaseaddavariabledescripti......
  • Linux系统C++程序设计1-Linux系统和POSIX 标准入门
    1Linux系统和POSIX标准入门本书介绍了Linux以及我们如何在Linux环境中使用C++来管理关键资源。我们想花一些时间在本章中加深对操作系统(OS)的基本了解。您将更多地了解一些特定技术、系统调用接口和可移植操作系统接口(POSIXPortableOperatingSystemInterface)的起源。在Lin......
  • C++基础 -4- C/C++混合编程
    ———————C/C++混合编程———————......