typedef是存储类说明符吗?

时间:2011-12-29 22:27:31

标签: c typedef

我尝试了以下代码

#include <stdio.h>

int main(void)
{
    typedef static int sint;
    sint i = 10;

    return 0;
}

并点击以下错误:

error: multiple storage classes in declaration specifiers

当我提到C99规范时,我发现typedefstorage class

6.7.1 Storage-class specifiers

Syntax

storage-class-specifier:
    typedef
    extern
    static
    auto
    register

Constraints: At most, one storage-class specifier may be 
             given in the declaration specifiers in a declaration

Semantics: The typedef specifier is called a ‘‘storage-class specifier’’ 
           for syntactic convenience only; 

我能找到的唯一解释(基于一些互联网搜索和交叉引用C99规范中的各个部分)是syntactic convenience only to make the grammar simpler

我正在寻找关于类型名称如何具有存储类说明符的一些理由/解释?

拥有像typedef static int sint;这样的代码

是否合理

或我哪里错了?!

4 个答案:

答案 0 :(得分:17)

是的,typedef是您在标准中找到的存储类说明符。在某种程度上,这是一种语法上的便利,但有意识的是,您可以拥有typedef 一个更“明显”的存储类说明符。

typedef声明为类型创建别名。

在声明static int x;中,x的类型为intstatic与该类型无关。

(请注意,如果您使用x的地址,&x的类型为int*int *y = &x;将合法static int *z = &x,但后者{ {1}}会影响static的存储类,并且与z的存储类无关。)

如果允许这样的事情,x将没有效果,因为没有声明对象。别名的类型只是static

int

答案 1 :(得分:5)

也许标准应该调用这些东西storage-class-or-typedef-specifier并说:

  

约束:最多可以在声明中的声明说明符中给出一个storage-classor-typedef-specifier

然后他们就不必添加关于语义的注释。

关于语义的评论只是说typedef实际上没有控制关于该类型所用存储的任何内容(因此它在语义上不是'存储说明符'),而是它在句法上处理和其他storage-class-specifier一样,因此不能与它们一起使用。

因此typedef无法确定将存储特定类型实例的位置 - 这是由实例的实际声明(隐式或显式)确定的。

即使你正在寻找的东西是允许的,这也是不好的做法,我敢肯定。考虑:

// in someheader.h
typedef static int sint;


// now in foo.c
#include "someheader.h"

int foo(void)
{
    sint i = 10;   // unless you're intimately knowledgeable about how 
                   //    `sint` is typedef'ed, this looks exactly like
                   //    an automatic


    // do some stuff that modifies `i`...

    return i;
}

sint bar(void)    // what does this mean?  is `bar()` static?
{
    return foo();
}

请注意,您是使用预处理器来获取'static typedef'效果,这会使bar()成为静态函数。这可能不是你想要的效果。也许

答案 2 :(得分:1)

你不能这样做 - 至少不能用MinGW的GCC - 在一个函数的内部或外部。

我会改用预处理器:

#include <stdio.h>

#define sint static int

int main(void)
{

    sint i = 10;

    return 0;
}

获得相同的结果。

我想这是因为“static int”不是“volatile int”的类型。

答案 3 :(得分:-2)

typedef在语法上与存储类相同。它不是存储类。 typedef与#define类似,但是typedef由.dend解释 #define是由预处理器编译的。 typedef可以进行超出其功能的文本替换 预处理器。

使用typedef的两个目的 1.便携性 2.更好的文档