多维C程序结构
Multidimension C program structure
我有一个用C写的程序,目的是作为多维码运行。例如,用户可以通过将 MACRO "DIMENSION" 设置为“1”或“2”来选择 1D 或 2D。这是一个简单的例子:
#define DIMENSION 1
#define UNUSED(x) (void)(x)
void fun(double *x, double *y);
int main()
{
double *x;
double *y;
x = calloc(5,sizeof(double));
#if DIMENSION == 2
y = calloc(5,sizeof(double));
#elif DIMENSION == 1
UNUSED(y);
#endif
fun(x,y);
free(x);
#if DIMENSION == 2
free(y);
#endif
return 0;
}
fun(double *x, double *y)
{
int i;
for(i = 0; i < 5; i++)
{
x[i] = i;
#if DIMENSION == 2
y[i] = i;
#endif
}
}
需要指出的是,我正在使用 GCC(并非我的所有最终用户都会使用)并且我确实启用了编译器选项 -Wuninitialized 和 -Wmaybe-uninitialized。我想在编译过程中抑制警告,但仍保留检查。我读过有关使用以下内容的信息:
#define UNUSED(x) (void)(x)
它似乎抑制了一些警告,但不是全部。这是因为即使我没有初始化函数 "fun" 也采用了 y 项吗?我将如何解决这个问题?理想情况下,通过将 "DIMENSION" 设置为“1”,代码将在没有警告的情况下编译为一维代码,并且不需要内存开销。建议?谢谢
尝试
#define DIMENSION 1
#include<cstdlib>
void fun(double *x, double *y);
int main()
{
double *x = NULL;
double *y = NULL;
x =(double*) malloc(5*sizeof(double));
#if DIMENSION == 2
y =(double*) malloc(5*sizeof(double));
#endif
fun(x,y);
free(x);
#if DIMENSION == 2
free(y);
#endif
return 0;
}
void fun(double *x, double *y)
{
int i;
for(i = 0; i < 5; i++)
{
x[i] = i;
#if DIMENSION == 2
y[i] = i;
#endif
}
}
最简单的解决方案就是将 y 初始化为 NULL。这使您可以摆脱所有 UNUSED
废话。
#define DIMENSION 1
void fun(double *x, double *y);
int main()
{
double *x;
double *y = NULL;
x = calloc(5,sizeof(double));
#if DIMENSION == 2
y = calloc(5,sizeof(double));
#endif
fun(x,y);
free(x);
#if DIMENSION == 2
free(y);
#endif
return 0;
}
void fun(double *x, double *y)
{
int i;
for(i = 0; i < 5; i++)
{
x[i] = i;
#if DIMENSION == 2
y[i] = i;
#endif
}
}
我有一个用C写的程序,目的是作为多维码运行。例如,用户可以通过将 MACRO "DIMENSION" 设置为“1”或“2”来选择 1D 或 2D。这是一个简单的例子:
#define DIMENSION 1
#define UNUSED(x) (void)(x)
void fun(double *x, double *y);
int main()
{
double *x;
double *y;
x = calloc(5,sizeof(double));
#if DIMENSION == 2
y = calloc(5,sizeof(double));
#elif DIMENSION == 1
UNUSED(y);
#endif
fun(x,y);
free(x);
#if DIMENSION == 2
free(y);
#endif
return 0;
}
fun(double *x, double *y)
{
int i;
for(i = 0; i < 5; i++)
{
x[i] = i;
#if DIMENSION == 2
y[i] = i;
#endif
}
}
需要指出的是,我正在使用 GCC(并非我的所有最终用户都会使用)并且我确实启用了编译器选项 -Wuninitialized 和 -Wmaybe-uninitialized。我想在编译过程中抑制警告,但仍保留检查。我读过有关使用以下内容的信息:
#define UNUSED(x) (void)(x)
它似乎抑制了一些警告,但不是全部。这是因为即使我没有初始化函数 "fun" 也采用了 y 项吗?我将如何解决这个问题?理想情况下,通过将 "DIMENSION" 设置为“1”,代码将在没有警告的情况下编译为一维代码,并且不需要内存开销。建议?谢谢
尝试
#define DIMENSION 1
#include<cstdlib>
void fun(double *x, double *y);
int main()
{
double *x = NULL;
double *y = NULL;
x =(double*) malloc(5*sizeof(double));
#if DIMENSION == 2
y =(double*) malloc(5*sizeof(double));
#endif
fun(x,y);
free(x);
#if DIMENSION == 2
free(y);
#endif
return 0;
}
void fun(double *x, double *y)
{
int i;
for(i = 0; i < 5; i++)
{
x[i] = i;
#if DIMENSION == 2
y[i] = i;
#endif
}
}
最简单的解决方案就是将 y 初始化为 NULL。这使您可以摆脱所有 UNUSED
废话。
#define DIMENSION 1
void fun(double *x, double *y);
int main()
{
double *x;
double *y = NULL;
x = calloc(5,sizeof(double));
#if DIMENSION == 2
y = calloc(5,sizeof(double));
#endif
fun(x,y);
free(x);
#if DIMENSION == 2
free(y);
#endif
return 0;
}
void fun(double *x, double *y)
{
int i;
for(i = 0; i < 5; i++)
{
x[i] = i;
#if DIMENSION == 2
y[i] = i;
#endif
}
}