2013-02-25 125 views
0

不同的情况下,变量和函数名我有一个变量命名SETLOCAL和功能命名为无效SETLOCAL(无效)名称相同,但在C

我使用C51 KEIL编译器来构建代码和链接器提供了以下错误:

“外部ATTRIBUT不匹配PUBLIC”

是它无法为函数和变量使用相同的名称?有不同的情况?

+2

这可能是编译器的一个缺陷。但不区分大小写的编译器必须是旧石器时代的。就语言而言,'foo','foO','fOo','Foo'是四个不同的名称。或者你的代码中有一个你忽略的错误。 – 2013-02-25 12:52:11

+2

编译器是否真的用大写拼写大写?您的'setlocal'变量是否会因为编译器被截断为8个重要字符而与标准C函数'setlocale()'发生冲突?如果环境仅支持8个重要字符,则不符合C99,但可能对小型系统的支持不包括C99强制要求的较长名称(与C89相比,C89只需要6个字母作为外部名称)。 – 2013-02-25 13:09:04

+0

不是在我的情况下,它不会给拼写错误带来错误。其C51编译器可能不完全符合c99。我已将变量名更改为setlocal1来解决我的问题。 – 2013-02-27 05:36:20

回答

3

该特定的编译器适用于嵌入式系统(使用8051芯片),并且真正针对这些环境。我已经看到该领域的编译器甚至不支持浮点运算,Keil明确表示,虽然它基于,在C90上基于,但该标准有deviations

按上Keil website列出的编译器限制:

Names may be up to 255 characters long. The C language provides for case sensitivity in regard to function and variable names. However, for compatibility reasons, all names in the object file appear in capital letters. It is therefore irrelevant if an external object name within the source program is written in capital or small letters.

因此这是,至于连接方面,你有setlocal变量和SetLocal功能之间的冲突,一个安全的赌注,无论是其中将被视为SETLOCAL

这也解释了(如您的评论中所述)为什么将变量名更改为setlocal1可以解决您的问题。虽然这些符号不区分大小写,但他们唯一的255个字符。

相关问题