我尝试了以下代码
#include <stdio.h>
int main(void)
{
typedef static int sint;
sint i = 10;
return 0;
}
并点击以下错误:
error: multiple storage classes in declaration specifiers
当我提到C99规范时,我发现typedef
是storage 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;
这样的代码
或我哪里错了?!
答案 0 :(得分:17)
是的,typedef
是您在标准中找到的存储类说明符。在某种程度上,这是一种语法上的便利,但有意识的是,您可以拥有typedef
或一个更“明显”的存储类说明符。
typedef声明为类型创建别名。
在声明static int x;
中,x
的类型为int
。 static
与该类型无关。
(请注意,如果您使用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.更好的文档