C++ g++;命令行宏定义字节流

C++ g++;命令行宏定义字节流,c++,gcc,macros,g++,sh,C++,Gcc,Macros,G++,Sh,我正在寻找通过选项-D将字节流定义为gcc/g++命令行中的宏的解决方案,例如-Dxxx=byte_-stream 下面是代码片段 #ifndef MAGIC_BYTES #define MAGIC_BYTES "\x01\x02\x00\x00\xa0\xb0" #endif 我希望每次都可以在不编辑源代码的情况下重新编译代码,而是使用-DMAGIC_BYTES=xxx来定义字节流 我知道编辑源代码可能是解决方案,但我只是想知道如何从命令行定义这样的字节流 更新 我把这个问题的简单代码放在下

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

下面是代码片段

#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;
}
/*当
*编译:gcc-o宏。/macro.c
*输出:0x1、0x2、0x3、0x4、0x5,
*
*编译:gcc-o宏-DMAGIC\u字节=\“\xa1\xa2\xa3\xa4\xa5\”/macro.c
*输出:0x78,0x61,0x31,0x78,0x61,
*但我期望0xa1、0xa2、0xa3、0xa4、0xa5
*/
#包括
#ifndef魔字节
#定义魔术字节“\x01\x02\x03\x04\x05”
#恩迪夫
int main()
{
char buf[]={MAGIC_BYTES};
对于(int i=0;i<5;++i)
printf(“%#x”,buf[i]);
printf(“\n”);
返回0;
}

首先,这在很大程度上取决于您的环境和所使用的shell。对于
/bin/sh
,您可以尝试以下操作

-DMAGIC_BYTES='"\x01\x02"'

这就是用
''
对整个字符串进行转义

您给出的示例
-Dxxx=byte\u-stream
有什么问题?这应该是开箱即用的,如果您想将它们传输到源代码中,您可能只需要转义
。但这同样取决于启动编译器的系统/外壳程序。@Jens,问题是转义问题。我使用的是debian。当我尝试使用-DMAGIC\u BYTES=\”\x01\x02时\“,如果我在代码中转储字节流,则没有获得由ASCII代码0x01和0x02的2个字符组成的字节流。
char buf[]=MAGIC_BYTESMAGIC_BYTES
是字符串文字。@Maxim,是的,谢谢你指出。我用-DMAGIC_BYTES='\x01\x02''试过了,它对我有用。如果添加额外的“\”以转义“\”,则结果不正确。已在debian/bash上验证。谢谢。好的,相应地修改了答案