如何根据C编程语言标准初始化一个结构体
我想初始化一个struct元素,在声明和初始化中分割。 这是我的:
typedef struct MY_TYPE { boolean flag; short int value; double stuff; } MY_TYPE; void function(void) { MY_TYPE a; ... a = { true, 15, 0.123 } }
这是按照C编程语言标准(C89,C90,C99,C11等)来声明和初始化MY_TYPE
的局部variables的MY_TYPE
吗? 还是有什么更好或至less有工作?
更新我结束了一个静态初始化元素,我根据我的需要设置每个子元素。
在(ANSI)C99中,可以使用指定的初始化程序来初始化结构:
MY_TYPE a = { .flag = true, .value = 123, .stuff = 0.456 };
编辑:其他成员初始化为零:“省略字段成员隐式初始化为具有静态存储持续时间的对象相同。 ( https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html )
你可以用复合文字来做。 根据该页面,它工作在C99(也算作ANSI C )。
MY_TYPE a; a = (MY_TYPE) { .flag = true, .value = 123, .stuff = 0.456 }; ... a = (MY_TYPE) { .value = 234, .stuff = 1.234, .flag = false };
初始化程序中的名称是可选的; 你也可以写:
a = (MY_TYPE) { true, 123, 0.456 }; ... a = (MY_TYPE) { false, 234, 1.234 };
我看到你已经收到了有关ANSI C 99的答案,所以我将抛出一个关于ANSI C 89的文章。ANSI C 89允许你用这种方式初始化一个结构:
typedef struct Item { int a; float b; char* name; } Item; int main(void) { Item item = { 5, 2.2, "George" }; return 0; }
一个重要的事情要记住,在你初始化结构中的一个对象/variables的同时,其它所有variables都将被初始化为默认值。
如果你没有初始化你的结构中的值,所有的variables将包含“垃圾值”。
祝你好运!
a = (MYTYPE){ true, 15, 0.123 };
在C99中会做的很好
你已经差不多了
MY_TYPE a = { true,15,0.123 };
快速search“结构初始化C” 显示我这个
正如Ron Nuni所说:
typedef struct Item { int a; float b; char* name; } Item; int main(void) { Item item = {5, 2.2, "George"}; return 0; }
一个重要的事情要记住:在你初始化结构中的一个对象/variables的同时,其它所有的variables都将被初始化为默认值。
如果你没有初始化你的结构体中的值(也就是说,如果你声明了那个variables),所有的variable.members
将只包含“垃圾值”, 只有当声明是本地的!
如果声明是全局的或静态的 (就像这种情况一样),所有未初始化的variable.members
将被自动初始化为:
-
0
表示整数和浮点数 -
'\0'
为char
(当然这与0
相同,而char
是一个整型) -
NULL
指针。
C编程语言标准ISO / IEC 9899:1999 (俗称C99)允许使用指定的初始化程序初始化结构或联合的成员,如下所示:
MY_TYPE a = { .stuff = 0.456, .flag = true, .value = 123 };
在paragraph 7
节6.7.8 Initialization
paragraph 7
中定义了ISO / IEC 9899:1999标准的6.7.8 Initialization
为:
如果一个代号有forms
。 识别码
那么当前对象(下面定义)应该具有结构或联合types,标识符应该是该types成员的名称。
请注意,同一部分的paragraph 9
段指出:
除非另有明确规定,否则就本小节而言,结构体和联合体types的未命名成员不参与初始化。 即使在初始化之后,结构对象的未命名成员也具有不确定的值。
在GNU GCC实现中,被省略的成员被初始化为零或类似于零的types适当的值。 如GNU GCC文档的6.27节指定的初始化程序中所述:
隐含的字段成员被隐式地初始化为具有静态存储持续时间的对象。
根据官方博客文章C ++一致性路线图, Microsoft Visual C ++编译器应该支持自2013版以来的指定初始化器。 段在MSDN Visual Studio文档中初始化 Initializing unions and structs
文章表明,未命名的成员初始化为类似于GNU GCC的适当的零值。
取代ISO / IEC 9899:1999的新ISO / IEC 9899:2011标准(俗称C11)保留了6.7.9 Initialization
指定初始值。 它也保留paragraph 9
不变。
如果MS没有更新到C99,MY_TYPE a = {true,15,0.123};
void function(void) { MY_TYPE a; a.flag = true; a.value = 15; a.stuff = 0.123; }
我find了另一种初始化结构的方法。
结构:
typedef struct test { int num; char* str; } test;
初始化:
test tt = { num: 42, str: "nice" };
按照GCC的文档,这个语法从GCC 2.5开始就已经过时了 。
我不喜欢这些答案,所以我做了我自己的。 我不知道这是不是ANSI C,它只是默认模式下的GCC 4.2.1。 我永远不会记得包围,所以我开始我的数据的一个子集,并与编译器的错误消息战斗,直到它closures。 可读性是我的首要任务。
// in a header: typedef unsigned char uchar; struct fields { uchar num; uchar lbl[35]; }; // in an actual c file (I have 2 in this case) struct fields labels[] = { {0,"Package"}, {1,"Version"}, {2,"Apport"}, {3,"Architecture"}, {4,"Bugs"}, {5,"Description-md5"}, {6,"Essential"}, {7,"Filename"}, {8,"Ghc-Package"}, {9,"Gstreamer-Version"}, {10,"Homepage"}, {11,"Installed-Size"}, {12,"MD5sum"}, {13,"Maintainer"}, {14,"Modaliases"}, {15,"Multi-Arch"}, {16,"Npp-Description"}, {17,"Npp-File"}, {18,"Npp-Name"}, {19,"Origin"} };
数据可能会以您制作的制表符分隔文件的forms开始生效 – 将其replace为其他内容。 是的,这是Debian的东西。 因此,一个{}(表示数组)的外部对,然后另一对每个结构里面。 用逗号隔开 把东西放在一个标题中并不是必须的,但是我的结构中有大约50个项目,所以我希望它们在一个单独的文件中,这样既可以避免我的代码出现混乱,所以更换起来更容易。
C中的结构可以这样声明和初始化:
typedef struct book { char title[10]; char author[10]; float price; } book; int main() { book b1={"DS", "Ajay", 250.0}; printf("%s \t %s \t %f", b1.title, b1.author, b1.price); return 0; }