代码之家  ›  专栏  ›  技术社区  ›  benzado

检查C中是否存在外部定义的标识符

  •  0
  • benzado  · 技术社区  · 15 年前

    我在ObjuleC开发IOS时遇到这个问题,但是这应该应用于任何使用C/OS的XC/IOS链接器的C/C++ + Objtovi-C代码。解决方案包括 another question ,但我对 为什么? .

    extern char * const BrandNewIdentifier;
    

    我想编译我的应用程序并在库的早期版本的系统上运行它,在这个版本中,常量没有定义,所以为了安全起见,我不认为它已经定义。

    if (BrandNewFunc) {
        BrandNewFunc("foobar", 42);
    } else {
        printf("Your system does not support some thing.");
    }
    

    而不是包含函数代码的地址, BrandNewFunc

    if (BrandNewIdentifier) ... // blows up here
    

    取而代之的是检查标识符的地址:

    if (&BrandNewIdentifier) {
        printf("You got it!");
    }
    

    我可以理解其中的逻辑: BrandNewIdentifier 布兰登福斯 ? 我不应该也被要求检查它的地址吗?或者是一致的,我忽略了什么?

    1 回复  |  直到 9 年前
        1
  •  2
  •   zwol    15 年前

    C标准的相关部分是第6.3.2.1节“左值、数组和函数指示符”。下面是它对函数的说明:

    一个 功能指示符 是具有函数类型的表达式。除非它是 sizeof 操作人员 或者一元 & 运算符,返回类型函数的函数指示符 转换为具有指向返回的函数的类型指针的表达式 .

    尺寸 对于函数指示符-这是一个语义错误]。

    命名函数的标识符是“具有函数类型的表达式”中最简单的一种。所以这意味着,如果 foo 已声明为函数,标识符 作为指向该函数的指针求值, 除了 当它是 & &foo 计算为指向该函数的指针)或的操作数 尺寸 (在这种情况下,较大的表达式, sizeof(foo) ,引发编译错误)。

    tl,医生:什么时候 & 在定义上是等价的。这是函数的特殊规则。这并不完全不同于数组的特殊规则,它在许多上下文中也会“衰减”到指针(该规则比我引用的规则高出一段)。

    旁白:是的,这意味着函数调用运算符 pfunc 是指向函数变量的指针, (*pfunc)() 被当作读 (&(*pfunc))() ... 或者只是 pfunc()