【问题标题】:Externally defined constant in C header fileC 头文件中外部定义的常量
【发布时间】:2017-06-01 16:50:43
【问题描述】:

我有一个在包含二维数组(通道)的头文件中定义的结构。 我想在编译时定义数组的大小,例如通过设置环境变量。

#ifndef GAMEBOARD_H
#define GAMEBOARD_H

struct gameboard
{
    int lanes[4][4];
    int isWonBy;
    int isFinished;
    int nextPlayer;
};

struct gameboard *put(struct gameboard *board, int laneIndex);

#endif

我想在运行时在此结构的所有实例之间保持数组的大小不变,但在编译时定义该大小,而不必每次都更改源代码。数组的高度和宽度应该是分开的,并且有默认值。

【问题讨论】:

  • 您可以让构建系统从环境中获取维度(或以其他方式设置维度),然后让构建系统设置编译器预处理器标志来为维度定义宏,并使用这些源中的宏。

标签: c constants header-files compile-time-constant


【解决方案1】:
#ifndef LANES_DIMENSION
#error "You must define LANES_DIMENSION at compile time!"
#endif

struct gameboard
{
    int lanes[LANES_DIMENSION][LANES_DIMENSION];
    int isWonBy;
    int isFinished;
    int nextPlayer;
};

GCC:

gcc -DLANES_DIMENSION=10 source.c

MSVC:

cl /DLANES_DIMENSION=10 source.c

【讨论】:

  • 您也可以将该值存储在结构中,以便在运行时推断它...
  • 我有多个包含此头文件的源文件,并使用 makefile 来编译它们。我应该将 -D... 参数添加到包含此标头的每个文件的配方中(甚至可能将其添加到 CFLAGS),还是有一种可靠的方法可以事先知道需要使用此参数编译哪个文件?
  • 通常人们会将此类标志添加到CFLAGS
【解决方案2】:

另一种方法是只为这个值创建一个小的array_size.h 文件。 #includegameboard.h 中并在编译时重新生成它,例如使用批处理文件,例如:

@echo #define ARRAY_SIZE %ENV_DEF% >array_size.h

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    相关资源
    最近更新 更多