尝试声明全局结构时,初始化器元素不是恒定的

时间:2018-10-10 05:55:11

标签: c

我目前是一名Java程序员,为一个类在C中做一些工作,而我一直在为两者之间的差异而苦苦挣扎。当前,我正在尝试使用编译器挂钩添加功能,以计算所执行程序的每个功能所花费的时间。我为此所做的努力是,我的解决方案是使用堆栈,而我无法实例化(如果使用的话甚至合适吗?)堆栈,因为我无法添加主方法或此类方法来创建它在一开始。这是我的代码:

#include <stdio.h>
#include <time.h>
#include "mystack.h"

static stack_t* entry_times=create_stack(500);
static unsigned int count_entered=0;
static unsigned int count_completed=0;


__attribute__((no_instrument_function))
void __cyg_profile_func_enter(void *this_fn, void *call_site){
    count_entered++;
    time_t start_time;
    time(&start_time);
    stack_enqueue(entry_times, start_time);
    printf("Total Functions Entered: %d\n", count_entered);

}

__attribute__((no_instrument_function))
void __cyg_profile_func_exit(void *this_fn, void *call_site){

    time_t end_time;
    time(&end_time);
    time_t start_time = stack_dequeue(entry_times);
    double difference = difftime(end_time, start_time);
    count_completed++;
    printf("Time in Function: %d\n", difference);

}

现在,当我尝试编译此代码时,我得到一个“初始化元素不是常量”错误,指向创建我的entry_times堆栈的行。如何解决此错误,或重构代码以防止出现此问题?

很抱歉,如果这是重复的主题,我已经进行了大量搜索,并且怀疑我只是不知道实际要搜索什么才能找到所需的信息。

2 个答案:

答案 0 :(得分:3)

John Zwinck的链接中解释了为什么会出错,但是如何为您解决它取决于。您可以创建构造函数来为您初始化,例如

static stack_t* entry_times;
__attribute__((constructor))
void my_init(){
    entry_times=create_stack(500);
}

或者您可以围绕它创建包装函数

stack_t* my_entry_times(){
    static stack_t* entry_times;
    if (!entry_times) {
        entry_times=create_stack(500);
    }
    return entry_times;
}

并在代码中使用my_entry_times()代替entry_times

答案 1 :(得分:0)

在C语言中,在文件或全局范围内初始化变量时无法调用函数。

您应该调用malloc为您分配一些内存,如下所示:

static stack_t* entry_times = NULL;

entry_times = (stack_t*)malloc(500 * sizeof(stack_t));

这将为您提供500个stack_t实例。

当您不再需要内存时,需要free

编辑:

这是我为您解决的问题的解决方案-不太漂亮,但是如果您仅具有这两个功能,则会受到很大限制...

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "mystack.h"

static stack_t* entry_times=NULL;
static unsigned int count_entered=0;
static unsigned int count_completed=0;


__attribute__((no_instrument_function))
void __cyg_profile_func_enter(void *this_fn, void *call_site){
    if (entry_times == NULL) {
        entry_times = (stack_t *)malloc(500 * sizeof(stack_t));
    }
    count_entered++;
    time_t start_time;
    time(&start_time);
    stack_enqueue(entry_times, start_time);
    printf("Total Functions Entered: %d\n", count_entered);

}

__attribute__((no_instrument_function))
void __cyg_profile_func_exit(void *this_fn, void *call_site){

    time_t end_time;
    time(&end_time);
    time_t start_time = stack_dequeue(entry_times);
    double difference = difftime(end_time, start_time);
    count_completed++;
    if (entry_times != NULL) {
        free(entry_times);
        entry_times = NULL;
    }
    printf("Time in Function: %d\n", difference);

}