【发布时间】: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,真的,谢谢你的指出。