【问题标题】:g++ command line macro define byte streamg++命令行宏定义字节流
【发布时间】:2017-10-17 15:01:19
【问题描述】:

我正在寻找通过选项 -D 从 gcc/g++ 命令行将字节流定义为宏的解决方案,例如-Dxxx=byte_stream。

下面是代码sn-p,

#ifndef MAGIC_BYTES
#define MAGIC_BYTES "\x01\x02\x00\x00\xa0\xb0"
#endif

我希望每次我都可以重新编译代码而不用编辑源代码而是使用 -DMAGIC_BYTES=xxx 来定义字节流。

我知道编辑源可能是解决方案,但只是想知道如何从命令行定义这样的字节流。

更新,

我把这个问题的简单代码放在下面,

/* When
 * compile: gcc -o macro ./macro.c
 * output: 0x1, 0x2, 0x3, 0x4, 0x5,
 *
 * compile: gcc -o macro -DMAGIC_BYTES=\"\xa1\xa2\xa3\xa4\xa5\" ./macro.c
 * output: 0x78, 0x61, 0x31, 0x78, 0x61, 
 * but I expect 0xa1, 0xa2, 0xa3, 0xa4, 0xa5
 */
#include <stdio.h>

#ifndef MAGIC_BYTES
#define MAGIC_BYTES "\x01\x02\x03\x04\x05"
#endif

int main()
{
    char buf[] = { MAGIC_BYTES };
    for (int i = 0; i < 5; ++i)
        printf("%#x, ", buf[i]);
    printf("\n");
    return 0;
}

【问题讨论】:

  • 您给出的示例-Dxxx=byte_stream 有什么问题?这应该是开箱即用的,如果您想将它们传输到源中,您可能只需要转义 "。但这又取决于启动编译器的系统/shell。
  • @Jens,问题是转义问题。我正在使用debian。当我尝试使用 -DMAGIC_BYTES=\"\x01\x02\" 时,如果我在代码中转储字节流,我没有得到由 2 个字符组成的字节流,ASCII 码为 0x01 和 0x02。
  • char buf[] = MAGIC_BYTES; 因为MAGIC_BYTES 是字符串文字。
  • @Maxim,真的,谢谢你的指出。

标签: c++ gcc macros g++ sh


【解决方案1】:

首先,这在很大程度上取决于您的环境以及您使用的外壳。对于/bin/sh,您可以尝试类似

-DMAGIC_BYTES='"\x01\x02"'

'' 转义整个字符串。

【讨论】:

  • 我尝试使用 -DMAGIC_BYTES='"\x01\x02"',它对我有用。如果添加额外的“\”来转义“\”,则结果不正确。在 debian/bash 上验证。谢谢。
  • 好的,相应地改变了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多