Возможно ли, чтобы препроцессор C / C ++ обнаруживал некоторые параметры компилятора? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть функция с

static int include[MAX_NODE_NUMBER][MAX_NODE_NUMBER][MAX_NODE_NUMBER*MAX_NODE_NUMBER];
static bool calculated[MAX_NODE_NUMBER][MAX_NODE_NUMBER][MAX_NODE_NUMBER*MAX_NODE_NUMBER]={};

, где MAX_NODE_NUMBER равно 200. Это можно скомпилировать, только если -mcmodel=large в опции gcc / g ++. Две переменные stati c предназначены только для кэширования некоторых данных, поэтому они не так необходимы. Можно ли кодировать как

#if <some condition>
static int include[MAX_NODE_NUMBER][MAX_NODE_NUMBER][MAX_NODE_NUMBER*MAX_NODE_NUMBER];
static bool calculated[MAX_NODE_NUMBER][MAX_NODE_NUMBER][MAX_NODE_NUMBER*MAX_NODE_NUMBER]={};
#endif

, чтобы программа могла быть скомпилирована как для большой, так и для маленькой памяти.

Ответы [ 2 ]

3 голосов
/ 24 февраля 2020

g++ определяет:

$ g++ -E -dD -xc++ /dev/null | grep -i model
#define __code_model_small__ 1

$ g++ -E -dD -xc++ -mcmodel=large /dev/null | grep -i model
#define __code_model_large__ 1

В качестве альтернативы:

$ diff <(g++ -E -dD -xc++ /dev/null) <(g++ -E -dD -xc++ -mcmodel=large /dev/null)
270c270
< #define __code_model_small__ 1
---
> #define __code_model_large__ 1
0 голосов
/ 24 февраля 2020

у вас есть опция командной строки -D, где вы можете определить символ

, например,

-DMODEL_LARGE

, затем в исходном файле:

#ifdef MODEL_LARGE
static int include[MAX_NODE_NUMBER][MAX_NODE_NUMBER][MAX_NODE_NUMBER*MAX_NODE_NUMBER];
static bool calculated[MAX_NODE_NUMBER][MAX_NODE_NUMBER][MAX_NODE_NUMBER*MAX_NODE_NUMBER]={};
#endif

...