2017-01-30 150 views
1

我有2个定义,其中一个带有一个字符串,另一个带有一个数字。如何从字符串和数字定义一个常量数组。这个数组中还有一些额外的常量。C字符串到阵列

我该如何编写这段代码,使之在数组foobar中具有0x22,0x41,0x42,0x42,0x21,来自定义的FOO和BAR?

#define FOO "AB" 
#define BAR 33 

extern int rs232_write(const unsigned char *data, unsigned char count); 

const unsigned char foobar[] = 
{ 
    0x22, 
    FOO[0], /*what must i put here, this do not work*/ 
    FOO[1], 
    0x42, 
    BAR, 
}; 


int main(void) 
{ 
    rs232_write(foobar,sizeof(foobar)); 
    return 1; 
} 

在GCC,例如,我得到的错误:

./001.c:9:5: error: initializer element is not constant 
    FOO[0], /*what must i put here*/ 
    ^

弦乐总是具有相同的长度。 我也试着在其他的方式:我也得到一个错误

#define FOO "AB" 
#define BAR 33 

extern int rs232_write(const unsigned char *data, unsigned char count); 

const char foobar[] = \ 
    "\x22" \ 
    FOO \ 
    "\x42" \ 
    BAR /*what must i put here, this also not work*/ 


int main(void) 
{ 
    rs232_write(foobar,sizeof(foobar)); 
    return 1; 
} 

这里,例如GCC打印:

./002.c:2:13: error: expected ‘,’ or ‘;’ before numeric constant 
#define BAR 33 
      ^

我就没有太大的空间,微控制器的工作,所以我会喜欢避免在运行时创建数组,我的编译器只支持C89。

+0

有什么不对你告诉我们的代码? –

+0

查看评论,编译器不接受它(也试用gcc),“错误:初始化器元素不是常量”和“错误:预计','或';'数字常量之前” – 12431234123412341234123

+0

当发布关于构建错误的问题时,在问题的正文中始终包含确切的错误(未编辑和未修改,最重要的*完整*表格)。最好是完整版本日志的直接复制粘贴。 –

回答

1

最简单的,使用memcpy

#include <stdio.h> 
#include <string.h> 

#define FOO "AB" 
#define BAR 33 

extern int rs232_write(const unsigned char *data, unsigned char count); 

unsigned char _foobar[] = 
{ 
    0x22, 
    0, 0, 
    0x42, 
    BAR, 
}; 
const unsigned char *foobar; 

int main(void) 
{ 
    foobar = (const unsigned char *)memcpy(_foobar + 1, FOO, 2) - 1; 
    rs232_write(foobar,sizeof(foobar)); 
    return 0; 
} 

丑,使用X Macrocompound literal

这样你可以使用前两位数字:

const unsigned char foobar[] = 
{ 
    0x22, 
    'A', 'B', 
    0x42, 
    33, 
}; 

或满弦"AB"

#include <stdio.h> 

#define FOO X('A', 'B', '\0') 
#define BAR 33 

extern int rs232_write(const unsigned char *data, unsigned char count); 

const unsigned char foobar[] = 
{ 
    0x22, 
    #define X(a, b, c) a, b 
    FOO, 
    #undef X 
    #define X(a, b, c) ((char []){a, b, c}) 
    0x42, 
    BAR, 
}; 

int main(void) 
{ 
// rs232_write(foobar,sizeof(foobar)); 
    printf("%s\n", FOO); 
    return 0; 
} 

输出:

AB 
+0

memcpy(),或者在我的情况下,简单写两个值,就是我试图避免的。但X宏将工作。我不知道你可以创建一个数组并同时进行函数调用。 – 12431234123412341234123

+0

是不是一个函数调用,看看链接:_这些功能是,宏可以调用其他宏,宏可以重新定义,并且嵌套的宏调用不会扩展,直到调用它的宏在其中一个它的调用._ –

+0

不,我讨论'strcpy(buffer,((char []){0x44,0x61,0}))',我可以用一个我以前没有创建的数组调用strcpy()没有字符串,而不是宏。 – 12431234123412341234123

1

这应该工作:

#include<stdio.h> 

#define FOO 'A','B' 
#define BAR 33 

const char foobar[] = { 
    0x22, 
    FOO, 
    0x42, 
    BAR, 
    '\0' 
}; 

int main(void) 
{ 
    printf("%s\n", foobar); 
    return 0; 
} 

BTW这是非常不好的给init阵列方式,也许可以更好地解释你的目的。

+0

但我仍然需要FOO作为字符串在其他地方,所以有可能从这个定义创建一个常量字符串? – 12431234123412341234123

+0

它基于一个二进制rs232协议,我无法更改,我需要在一个软件包(帧组)中发送软件名称和版本。 – 12431234123412341234123

0

问题是编译器在编译时不知道字符串文字"AB"将放在内存中的位置。它的位置将在程序链接或可能被载入内存时决定。

因此,使用它不会导致foobar阵列初始化所需的编译时常量。

在这种情况下,您真的别无选择,只能在运行时使用设置foobar[1]foobar[2]一次。但是,即使在极小的嵌入式系统上,这在内存或时间上也不会产生太多的开销。如果程序运行超过几秒钟,它甚至不可能被测量。

+0

我不在乎时间,但我的程序的内存使用情况已经成为问题,我尝试将其减少到无需启用任何优化。 20字节的RAM可能听起来非常小,但您会注意到它只有1KiB – 12431234123412341234123

+0

@ 12431234123412341234123添加运行时初始化将增加约两条指令。如果你只有这个单个数组,那么它不可能导致问题。如果你有很多这样的数组,你可以考虑只使用一个,然后在运行时初始化所有数组。代码(通常)比数据小。你为什么不想启用优化?您是否尝试过使用'-Os'?它有什么区别? –

+0

@ 12431234123412341234123哦,你应该已经添加了所有的限制和目标平台到你的问题,这是非常相关的信息。 –

1
#include <stdio.h> 
#include <stdlib.h> 

#define FOO   "ab" 
#define BAR   33 

#define STRINGIFY(x) STRINGIFY2(x) 
#define STRINGIFY2(x) #x 

const char foobar[] = "\x22" FOO "\x42" STRINGIFY(BAR); 

int main(void) 
{ 
    printf("foobar = |%s| (%ld+1 characters)\n", 
    foobar, (long) sizeof(foobar) - 1); 
    return EXIT_SUCCESS; 
} 

运行这个程序。OUPUTS:

foobar = |"abB33| (6+1 characters) 
+0

我确实想要字节33,或者在这种情况下字符'!'在数组中,不是字节51(0x33)或字符“3”。所以它应该打印“abB!” – 12431234123412341234123

+0

@ 12431234123412341234123:那为什么不简单地'#define BAR“\ x21”'或'#define BAR“!”'? – AlexP

+0

我需要BAR作为其他地方的整数。但也许我可以#定义_BAR“!”和#define BAR _BAR [0] – 12431234123412341234123