【问题标题】:Redeclare a typedef in C [closed]在 C 中重新声明 typedef [关闭]
【发布时间】:2020-03-11 15:59:41
【问题描述】:

我正在阅读 Brian W. Kernighan 和 Dennis M. Ritchie 所著的C 编程语言一书。

在 A.8.9 部分,书籍如下:

Typedef 名称可以在内部范围内重新声明,但必须是一组非空的类型说明符 给定的。例如,extern Blockno; 不会重新声明 Blockno,但 extern int Blockno; 会。

我感觉我理解extern Blockno;,但extern int Blockno; 是什么意思?

当我尝试这样做时,我得到一个编译错误,我仍然不明白这本书的意思!

【问题讨论】:

  • @Lundin 我不同意代码中有 extern 的说法,因为它不好......
  • @Lundin 根据我目前阅读的内容,可以在头文件中找到。除此之外,链接器如何理解我在不同文件中谈论相同的变量?
  • @Lundin 你的意思是你反对使用全局变量吗?
  • @AnttiHaapala 它可以用于带有全局变量的意大利面条编程目的,在这种情况下它是 100% 坏的。或者它可以用于不必要的显式函数声明,在这种情况下它只是多余的。唯一有效的用例是extern const(仍然值得怀疑)和跨文件共享嵌入式系统的寄存器映射(好的)。
  • @LiTTle 不要跨文件使用同一个变量。使用 setter/getter 函数。

标签: c scope declaration typedef extern


【解决方案1】:

他的意思是可以重新声明一个typedef名称。例如,它可以是一个变量名,前提是重新声明发生在内部范围内。

他指出这样的变量声明

extern Blockno;

不正确。变量应该有一个类型说明符,它是一个声明应该指定声明的实体具有哪种类型。早期的类型 int 用作默认类型。

所以写声明一个int类型的对象是正确的

extern int Blockno;

也就是说,这个声明在局部范围内引入了 int 类型的变量 Blockno。存储类说明符意味着此声明引用已定义的对象Blockno,具有外部或内部链接。

考虑以下演示程序

#include <stdio.h>

int Int = 10;

int main(void) 
{
    typedef int Int;

    {

        extern int Int;

        printf( "Int = %d\n", Int );
    }

    return 0;
}

它的输出是

Int = 10

块范围内的声明

extern int Int;

隐藏在外部作用域中声明的typedef名称Int并引用声明

int Int = 10;

在全局范围内。

【讨论】:

  • 比书上写的清楚多了!在代码中创建这种类型的“技巧”(同名,不同目的)是我还是真的很糟糕?我仍然觉得它的眼睛很奇怪!
  • @LiTTle 通常你应该避免使用全局变量。但是,如果使用它们,有时您需要在本地范围内引入它们。
猜你喜欢
  • 2016-12-17
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
相关资源
最近更新 更多