初始化静态结构

时间:2015-12-23 14:29:43

标签: c static initialization structure

我有以下结构:

typedef struct
{
    uint8* buffer;
    uint32 bufferLength;
} SRequest;

和一个功能:

void somefunction(const SRequest* request)
{
    //The following initialization of the pointer to static structure is not working
    static SRequest* request_ptr = {.buffer = request->buffer, 
                                    .bufferLength = 0};
    .
    .
}

还有另一种方法可以初始化request_ptr吗?

2 个答案:

答案 0 :(得分:2)

您正在尝试初始化一个指针,该指针的值不是指针而是struct。这不可行。

此外,具有静态存储持续时间的对象的初始化程序必须是编译时常量。当您在程序执行开始之前发现(逻辑上)发生此类对象的初始化时,此约束是有意义的。所有文件范围变量都具有静态持续时间,声明为static的局部变量也是如此,例如request_ptr。您正在尝试使用不是编译时常量的值初始化静态指针。

目前还不清楚你真正追求的是什么,但是如果你想在每次调用时创建一个SRequest指向与参数相同的缓冲区,那么可能是这样的:< / p>

void somefunction(const SRequest* request)
{
    SRequest local_request = {.buffer = request->buffer, 
                              .bufferLength = 0};
    .
    .
    .
}

请注意,我将local_request设置为自动变量而不是静态变量,以便在每次调用时应用其初始化程序,并将其设为struct,而不是指向其中的指针。

另一方面,如果你的目标是在第一次调用函数时初始化SRequest,其值从该调用的参数派生,然后在函数调用之间持续存在,那么你想要像这样的东西:

void somefunction(const SRequest* request)
{
    static int initialized = 0;
    static SRequest local_request;

    if (!initialized) {
        local_request.buffer = request->buffer;
        local_request.buffer_length = 0;
        initialized = 1;
    }
    .
    .
    .
}

如果initialized的成员适合替代local_request,您可以不使用local_request.buffer变量。例如,也许它可以用于您的目的而不是测试天气NULL<Window x:Class="SDITicketAudit.UIWindows.WaitingScreen" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:gif="http://wpfanimatedgif.codeplex.com" gif:ImageBehavior.AnimateInDesignMode="True" Title="Running Audits" ResizeMode="CanMinimize" Height="118.071" Width="245.6" WindowStartupLocation="Manual" Left="50" Top="100"> <Grid> <TextBlock x:Name="loadUpdates" HorizontalAlignment="Center" Margin="10,10,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Height="44" Width="220"/> <Image gif:ImageBehavior.RepeatBehavior="Forever" gif:ImageBehavior.AnimatedSource="pack://application:,,,/Resources/ajax-loader.gif" /> </Grid>

无论如何,我不清楚为什么你希望局部变量指定一个指针而不是一个结构。你可能确实想要这样做有可能的原因,但任何适用的都不明确。

答案 1 :(得分:0)

由于问题的标题似乎比特伦斯希尔所引用的更明确,所以在这里得到答案可能会很有趣。

您必须使用“复合文字”,它在C99标准中定义:

void somefunction(const SRequest* request)
{
    //The following initialization of the pointer to static structure is not working
    static SRequest* request_ptr = &(SRequest){
        .buffer = request->buffer,
        .bufferLength = 0};
}