【问题标题】:same name but with different case variable and function names in c相同的名称,但在 c 中具有不同的大小写变量和函数名称
【发布时间】:2023-03-14 19:10:02
【问题描述】:

我有一个名为 setlocal 的变量和一个名为 void SetLocal(void) 的函数

我正在使用 C51 keil 编译器构建代码,链接器给出以下错误:

“外部属性与公共属性不匹配”

函数和变量不能使用相同的名称吗?不同的情况?

【问题讨论】:

  • 可能是编译器的缺陷。但是不区分大小写的编译器必须是旧石器时代的。就语言而言,foofoOfOoFoo 是四个不同的名称。或者您忽略了代码中的错误。
  • 编译器真的会大写拼写错误吗?您的 setlocal 变量是否会因为编译器截断为 8 个有效字符而与标准 C 函数 setlocale() 发生冲突?如果环境仅支持 8 个有效字符,则不符合 C99,但对小型系统的支持可能不包括 C99 规定的较长名称(与 C89 相比,外部名称仅要求 6 个字符的单大小写)。
  • 否 在我的情况下,它不会给出拼写错误的错误。它的 C51 编译器可能不完全符合 c99。我已将变量名称更改为 setlocal1 以解决我的问题。

标签: c microcontroller keil


【解决方案1】:

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

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

名称最长可达 255 个字符。 C 语言在函数名和变量名方面提供区分大小写的功能。但是,出于兼容性原因,目标文件中的所有名称都以大写字母显示。因此,源程序中的外部对象名称是用大写字母还是小写字母书写是无关紧要的。

所以可以肯定的是,就链接器而言,setlocal 变量和SetLocal 函数之间存在冲突,两者都将被视为SETLOCAL

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

【讨论】:

    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2020-12-09
    • 2012-01-26
    • 2015-03-01
    • 2010-09-29
    • 1970-01-01
    相关资源
    最近更新 更多