gpt4 book ai didi

c - 是否可以在初始化程序中使用三元运算符初始化静态数组?

转载 作者:太空宇宙 更新时间:2023-11-04 01:00:30 25 4
gpt4 key购买 nike

是否可以在初始化器中使用三元运算符初始化静态数组?例如:

// Array of functions 
static const Callback_t CallbackArray[] =
{
GenConfig,
GenInfo,
/* here is the ternary operator to chose a callback */
Test() ? Config : NULLConfig,
};

其中 Test() 是一个返回 0 或 1 的函数

// somewhere else in the code
int gVar = 0;

int TEST(void)
{
return gVar;
}

最佳答案

如果数组没有静态存储持续时间,则运算符可以用作初始化表达式。

来自C标准(6.7.9初始化)

4 All the expressions in an initializer for an object that has static or thread storage duration shall be constant expressions or string literals.

请注意,您可能不会声明一个函数数组,但您可以声明一个指向函数的指针数组。

这是一个演示程序

#include <stdio.h>

void f( void ) { puts( "f"); }
void g( void ) { puts( "g"); }

int main(void)
{
int x = 1, y = 2;

void ( *fp[] )( void ) = { x < y ? f : g };

fp[0]();

return 0;
}

程序输出为

f

如果一个函数类型太复杂,你可以为它引入一个 typedef。例如

#include <stdio.h>

void f( void ) { puts( "f"); }
void g( void ) { puts( "g"); }

int main(void)
{
int x = 1, y = 2;

typedef void F( void );

F * fp[] = { x < y ? f : g };

fp[0]();

return 0;
}

您可以使用条件运算符来初始化具有静态存储持续时间的数组。问题是条件必须是一个并不总是合适的常量表达式。例如

#include <stdio.h>

void f( void ) { puts( "f"); }
void g( void ) { puts( "g"); }

typedef void F( void );

F * fp[] = { 1 ? &f : &g };

int main(void)
{
fp[0]();

return 0;
}

来自 C 标准(6.6 常量表达式)

9 An address constant is a null pointer, a pointer to an lvalue designating an object of static storage duration, or a pointer to a function designator; it shall be created explicitly using the unary & operator or an integer constant cast to pointer type, or implicitly by the use of an expression of array or function type. The array-subscript [] and member-access . and -> operators, the address & and indirection * unary operators, and pointer casts may be used in the creation of an address constant, but the value of an object shall not be accessed by use of these operators.

关于c - 是否可以在初始化程序中使用三元运算符初始化静态数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41745159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com