2

我正在使用 MPLabs C18 C 编译器开发PIC 18f4685,当我尝试创建一组要打印到 LCD 上的短语时遇到问题。

如果我将 Codeblocks 与 gcc 一起使用并输入此代码,它会打印出我对控制台的期望... test1 test2 test3 test4

char *test[]={"test1","test2","test3","test4"};
printf("%s %s %s %s\n",test[0],test[1],test[2],test[3]);

但是,如果我在 C18 中使用此代码:

    char *phrase[]={"test1","test2"};

我收到警告说type qualifier mismatch in assignment,当我对芯片进行编程时,它会向 LCD 吐出垃圾,我有点期待它会这样做。

什么是声明我的短语的正确方法,因为某些东西显然是不正确的?

4

2 回答 2

4

显然字符串文字rom const char[N]在 MPLab C 中。所以你需要像这样声明你的对象:

rom const char *rom test[]={"test1","test2","test3","test4"};

MPLAB C18 C 编译器用户指南中,有一章名为 ISO DIVERGENCES (2.7),2.7.3 指的是字符串文字。

从 2.7.3 开始:

使用 MPLAB C18 时,程序存储器中的字符串表可以声明为:

rom const char table[][20] =   { "string 1", "string 2",  
                                 "string 3", "string 4" }; 
rom const char *rom table2[] = { "string 1", "string 2", 
                                 "string 3", "string 4" }; 
于 2012-06-03T21:27:57.417 回答
2

我认为@awoodland(现已删除)的答案基本上是正确的想法。

声明:

char *phrase[] = {"test1", "test2"};

是完全有效的 C,但它可能存在问题。C 字符串文字不是const,但尝试修改它们具有未定义的行为。(它们实际上是const在 C++ 中,这会使上述声明非法。)

C18 很可能正在强制执行const字符串文字。如果是这样,您应该能够通过添加const关键字来避免错误:

const char *phrase[] = {"test1", "test2"};

无论如何,在此处添加const是一个好主意,因为没有它,编译器将无法诊断修改其中一个字符串的尝试。

请注意,gcc 的-Wwrite-strings选项启用了类似的非标准功能。

编辑 :

见 ouah 的回答。标准 C中const不需要 ,但无论如何使用它是个好主意。对于这个特定的实现,您还需要添加一个系统特定的rom关键字。

于 2012-06-03T21:29:42.783 回答