Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何创建使用字符串格式的给定变量文本的宏(或其他工具)?

如何创建使用字符串格式的给定变量文本的宏(或其他工具)?
EN

Stack Overflow用户
提问于 2012-06-05 15:09:32
回答 3查看 151关注 0票数 5

当我试图调查代码中的问题时,我是调试打印的粉丝:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cout << "foo:" << foo << "bar:" << bar << "baz:" << baz;

因为我经常写这样的代码,如果我能让它更通用,更容易输入,那就太棒了。可能是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DEBUG_MACRO(foo, bar, baz);

即使foobarbaz解析为变量名,而不是字符串,是否可以使用它们的变量名来创建字符串"foo:""bar:""baz:"?你能写一个接受未指定数量的参数的函数或宏吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-05 15:22:58

如果你有C++11,你可以用可变模板做一些类型安全且相当整洁的事情,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <string>
#include <iostream>

template <typename T>
void debug(const T& v) {
  std::cout << v << "\n";
}

template <typename T, typename... Tail>
void debug(const T& v, const Tail& ...args) {
  std::cout << v << " ";
  debug(args...);
}

#define NVP(x) #x":", (x)

int main() {
  int foo=0;
  double bar=0.1;
  std::string f="str";
  debug(NVP(foo),NVP(bar),NVP(f));
}

这里的NVP宏是完全可选的,只有当您想要打印代码中引用的名称时才需要它。

如果您真的想跳过NVP位,您可以使用Boost预处理器库(或使用您自己的库),例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <string>
#include <iostream>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>

template <typename T>
void debug_impl(const T& v) {
  std::cout << v << "\n";
}

template <typename T, typename... Tail>
void debug_impl(const T& v, const Tail& ...args) {
  std::cout << v << " ";
  debug_impl(args...);
}

#define NVP(x) #x":", (x)
#define MEMBER( r, data, i, elem ) BOOST_PP_COMMA_IF( i ) NVP(elem)

#define debug( members )                                \
  debug_impl(                                           \
  BOOST_PP_SEQ_FOR_EACH_I( MEMBER,, members )           \
  )


int main() {
  int foo=0;
  double bar=0.1;
  std::string f="str";
  debug((foo)(bar)(f));
}

代价是一些稍微奇怪的语法。我的例子是基于this answer的。我尝试使用可变宏来直接解决这个问题,作为一个“纯”C++11解决方案,但事实证明递归遍历列表比您希望的要复杂得多。

票数 4
EN

Stack Overflow用户

发布于 2012-06-05 15:13:14

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define DEBUG_MACRO(name) std::cout << #name << " = " << name << std::endl;

示例:http://ideone.com/agw4i

票数 1
EN

Stack Overflow用户

发布于 2012-06-05 15:17:33

你能写一个接受未指定参数数量的函数吗?

是的,但通常你不应该这样做。

您可以通过在声明中使用省略号来声明一个接受未指定数量的参数的函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int foo(string foo, ...)

但这有很大的问题。最大的问题是它破坏了类型安全。考虑一下当您不正确地使用带有未指定参数列表的另一个函数时会发生什么情况

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int n = 42;
char buf[256] = {};
sprintf(buf, "%s", n);

这是一个错误--我指定了一个字符串,但传递了一个int。最好的情况是,这将在我第一次调试我的程序时执行,并立即爆炸。然而,更有可能的是,在生产中第一次出现异常情况之前,代码永远不会运行,然后它会在交易日中途关闭整个程序。客户会打电话给你,对你大喊大叫,取消单元等等。好吧,我是戏剧性的,但重点是类型安全是你的朋友,即使你对它爱恨交加。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10899908

复制
相关文章
C# 判断文件/文件夹 是否存在
1、判断文件夹是否存在 //spath:文件夹路径名 using System.IO; if (Directory.Exists(spath)) { } else { DirectoryInfo directoryInfo = new DirectoryInfo(spath); directoryInfo.Create(); } 2、判断文件是否存在 // filePath 文件路径名 if (!File.Exists(filePath)) { //Messa
用户10325771
2023/03/01
1.6K0
java实现文件压缩,文件夹压缩,以及文件和文件夹的混合压缩
package util; /** * @program: transformation * @description: * @author: cuixy * @create: 2019-07-26 14:30 **/ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipE
崔笑颜
2020/06/08
2.8K0
Java 将文件夹打成压缩包 zip
  今天在做批量下载的时候,用到了就写一写吧,一般多文件下载通常都是通过压缩包下载的
彼岸舞
2020/12/02
4.8K0
python移动文件,将一个文件夹里面的文件移动到另一个文件夹
python移动文件,将一个文件夹里面的文件移动到另一个文件夹 import shutil import os def remove_file(old_path, new_path): print(old_path) print(new_path) filelist = os.listdir(old_path) #列出该目录下的所有文件,listdir返回的文件列表是不包含路径的。 print(filelist) for file in filelist:
青阳
2021/04/02
29.2K0
linux压缩文件夹,cksum比较两个文件或文件夹等是否一样
校验码就不管是什么了,估计是一个类似主键的唯一id吧!如果有跟这个文件一样的文件会是打印出相同的校验码,那么这两个文件就是同一个文件了。
全栈程序员站长
2022/08/05
2.8K0
linux压缩文件夹,cksum比较两个文件或文件夹等是否一样
【Auto.js】[zip压缩] 将文件夹压缩成zip包
将一个文件夹压缩成一个zip包,可应用于项目文件夹打包成zip, 文件夹过滤了目录中的空文件夹,因此,空文件夹不会被打包到zip包中. 由于本人JS知识有限,JAVA也不懂, 导致该函数, 打包大型文件时, 非常慢,性能低下. 如果@admin 有好的方法, 可以发一下, 谢谢.
红目香薰
2022/11/29
1.9K0
C#利用SharpZipLib解压或压缩文件夹实例操作
最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享。 这里主要解决文件夹包含文件夹的解压缩问题。 )下载SharpZipLib.dll,在http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx中有最新免费版本,“Assemblies for .NET 1.1, .NET 2.0, .NET CF 1.0, .NET CF 2.0: Download [297 KB] ”点击Download可以下载,解压后里边有好多文件夹
跟着阿笨一起玩NET
2018/09/19
3.1K0
golang 判断文件/路径是否存在、是否为文件夹/文件
golang判断文件或文件夹是否存在的方法为使用os.Stat()函数返回的错误值进行判断:
IT工作者
2022/07/01
2.9K0
python 判断文件、文件夹是否存在
>>> import os >>> os.path.exists('d:/assist') True >>> os.path.exists('d:/assist/getTeacherList.py') True >>> os.path.isfile('d:/assist') False >>> os.path.isfile('d:/assist/getTeacherList.py') True >>> os.makedirs('d:/assist/set') >>> os.path.exists('d:/
艳艳代码杂货店
2021/11/01
2.3K0
python 判断文件、文件夹是否存在
>>> import os >>> os.path.exists('d:/assist') True >>> os.path.exists('d:/assist/getTeacherList.py') True >>> os.path.isfile('d:/assist') False >>> os.path.isfile('d:/assist/getTeacherList.py') True >>> os.makedirs('d:/assist/set') >>> os.path.exists('d:/a
代码伴一生
2021/11/01
2.1K0
python 压缩文件夹 脚本
def backupToZip(folder): # Backup the entire contents of "folder" into a zip file.
用户5760343
2022/05/13
1.5K0
ASP.NET Core 将文件夹内容输出为压缩包文件方法
本文主要是告诉大家一个省内存的方法,将整个文件夹的内容作为一个压缩包输出,但是实际上没有申请那么多的内存,也不需要升级创建一个压缩包文件。原理是通过逐个读文件然后按照压缩包格式输出
林德熙
2020/08/02
1.6K0
是否可以删除 WinSxS 文件夹
一个常见问题是,“是否可以删除 WinSxS 文件夹来重新获得磁盘空间?” 简短的答案是“否”。但是,可以使用 Windows 中内置的工具来减小 WinSxS 文件夹的大小。
Windows技术交流
2020/04/13
5.2K0
tar压缩和解压文件或文件夹
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/124590.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/21
3.5K0
VBA 创建文件夹和判断文件夹是否存在!
Public Function 创建文件夹(ByVal 路径 As String, ByVal 文件夹名称 As String)
办公魔盒
2019/07/22
4.9K0
VBA 创建文件夹和判断文件夹是否存在!
ExcelVBA判断文件或文件夹是否存在
返回一个 String,用以表示一个文件名、目录名或文件夹名称,它必须与指定的模式或文件属性、或磁盘卷标相匹配。
哆哆Excel
2022/10/25
6.6K0
ExcelVBA判断文件或文件夹是否存在
golang判断文件或文件夹是否存在
golang判断文件或文件夹是否存在的方法为使用os.Stat()函数返回的错误值进行判断: 如果返回的错误为nil,说明文件或文件夹存在 如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在 如果返回的错误为其它类型,则不确定是否在存在 func PathExists(path string) (bool, error) { _, err := os.Stat(path) if err == nil {
李海彬
2018/03/19
5.7K0
tar压缩时排除特定文件和文件夹
一日一技是一个每天更新的栏目,力图做到让你每天用2分钟的时间掌握一个开发技巧。 ---- tar压缩文件的时候排除特定文件和文件夹: tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz . 注意末尾有一个点。
青南
2018/10/18
1.7K0
C#获取文件夹下的所有文件
 1、获得当前运行程序的路径 string rootPath = Directory.GetCurrentDirectory();   2、获得该文件夹下的文件,返回类型为FileInfo string path=@"X:\XXX\XX"; DirectoryInfo root = new DirectoryInfo(path); FileInfo[] files=root.GetFiles();   3、获得该文件夹下的子目录,返回类型为DirectoryInfo string path=
用户9127601
2021/11/01
6.3K0
Python实现批量压缩文件/文件夹——zipfile
zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的,
Python研究者
2021/08/30
2.4K0

相似问题

将文件移动到文件夹(C#)

22

C#将文件移动到文件夹

13

将压缩文件夹从移动到客户端

13

是否将文件移动到文件夹/分支中?

116

将多个文件夹移动到新文件夹并使用tar压缩该文件夹

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文