草庐IT

关于C#:宏在字符串末尾添加字符而不传递源字符串

codeneng 2023-03-28 原文

Macro to add character at end of string without passing source string

我正在尝试编写一个宏,它在字符串末尾添加一个字符(结束功能键)而不传递源字符串。

声明:

LEVEL_ENTRY(level) <<"Level1 Message";

预期的宏扩展

LEVEL_ENTRY(level) levelParser(level, std::ostringstream().flush() <<"Level1 Message");

我正在尝试这样

#define LEVEL_ENTRY(level) levelParser(level, std::ostringstream().flush()

C 宏可以进行这种扩展(不传递参数)吗?

编辑

为了让它现在能正常工作,我正在做类似的事情

#define LEVEL_ENTRY(level, msg) levelParser(level, std::ostringstream().flush() << msg)

LEVEL_ENTRY(level,"Level1 Message"<<"Message2");

真正的问题是我现在不能简单地更改语句'它在项目中的 1000 多个地方使用。

  • 您的宏是"有效的",但生成的代码不是。因此,最终结果无效。
  • @sujin - 花点时间重新阅读您的问题,您的"预期宏扩展"是无效的 C 并且还包含宏。
  • 粗略地说,如果你想让事情与宏一起正常工作,请使用将相关材料作为参数的宏。你说,你有 1000 个这种表示法的实例。所以,用 sed 在现代机器上修复应该需要几秒钟,即使它在 1000 个文件中的每个文件中只出现一次,并且文件每个 20K 行和总共 1 MiB,这不太可能.如果您(或您的前任之一)错误地设计了某些东西,则可能需要在需求发生变化时进行彻底的努力来修复它。


不,你不能将 << 东西放到宏中。宏由预处理器处理,C 语言解析器看不到,宏不支持任何类型的 << 语法。

A macro is a fragment of code which has been given a name. Whenever the name is used, it is replaced by the contents of the macro. There are two kinds of macros. They differ mostly in what they look like when they are used. Object-like macros resemble data objects when used, function-like macros resemble function calls.

https://gcc.gnu.org/onlinedocs/cpp/Macros.html

  • 谢谢你的解释。请看我更新的问题
  • 您更新的问题仍然意味着您希望宏扩展到传递给它的参数之外(您的预期语句在 <<"Level1 Message" 之后有一个 \\')\\')。我会为我的问题写一个小编辑。
  • 我无法更改我现有的声明。它在项目中的 1000 多个地方使用
  • 您说您要生成以下代码: LEVEL_ENTRY(level) levelParser(level, std::ostringstream().flush() <<"Level1 Message"); 这是无效的 C ,并且您要生成它的语句是 LEVEL_ENTRY(level) <<"Level1 Message"。你问的是不可能的。宏对 << 一无所知,并且不可能编写一个宏,在传递给它的参数之外的语句末尾任意添加一个结束 ) :(
  • 我期望的宏扩展是有效的 C 语法。我将类型传递给标准字符串流。请检查我的编辑,我如何设法实现这一目标。
  • 同样,您不能使用宏来执行此操作,请参阅 Bill Lynch 对非宏解决方案的回答。
  • 感谢您的澄清


解决问题的一种方法是:

struct Foo { int level; };

auto operator<<(Foo foo, char const *s)
{
    return levelParser(foo.level, std::ostringstream().flush() << s);
}

#define LEVEL_ENTRY(level) Foo{level}

  • 请注意,这不适用于 LEVEL_ENTRY(3) <<"foo" <<"bar";,但这可能超出了要求。
  • @Bill Lynch 您的评论是我的确切要求,这就是我使用 ostringstream 的原因。 LEVEL_ENTRY(3) << "foo" << "bar" << var1 << stringvar;
  • @sujin您是否希望将所有流式传输的结果传递给levelParser?更新问题的第一部分以包含此用法会很好吗?
  • BTW ostringstream().flush()ostringstream() 相同,为空时没有什么要刷新的


当然可以,但不涉及宏:

class LEVEL_ENTRY {
    public:
        LEVEL_ENTRY(level): level_(level) {}
        LEVEL_ENTRY(LEVEL_ENTRY const &) = delete;
        LEVEL_ENTRY & operator=(LEVEL_ENTRY const &) = delete;

        ~LEVEL_ENTRY() {
             levelParser(level, oss);
        }

        LEVEL_ENTRY & operator<<(const char *message) {
             oss << message;
        }

    private:
        int level_;
        std::ostringstream oss;
};

LEVEL_ENTRY(1) <<"Level1 Message";

  • 为每个语句创建一个类的实例不是一个好主意。
  • @sujin 为什么不呢?实际上,您使用 ostringstream 类的实例正是这样做的。

有关关于C#:宏在字符串末尾添加字符而不传递源字符串的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  5. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  6. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  7. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  8. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  9. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  10. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

随机推荐