2013-02-25 157 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個字符。

相關問題