Есть ли способ сделать утверждение во время компиляции в стиле C ++, чтобы определить порядковый номер машины?

У меня были следующие проблемы для ответа @Lalit Kumars,

ORA-19202: Error occurred in XML processing
ORA-00904: "SUCCESS": invalid identifier
ORA-06512: at "SYS.DBMS_XMLGEN", line 288
ORA-06512: at line 1
19202. 00000 -  "Error occurred in XML processing%s"
*Cause:    An error occurred when processing the XML function
*Action:   Check the given error message and fix the appropriate problem

Решение:

WITH  char_cols AS
  (SELECT /*+materialize */ table_name, column_name
   FROM   cols
   WHERE  data_type IN ('CHAR', 'VARCHAR2'))
SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword",
       SUBSTR (table_name, 1, 14) "Table",
       SUBSTR (column_name, 1, 14) "Column"
FROM   char_cols,
       TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select "'
       || column_name
       || '" from "'
       || table_name
       || '" where upper("'
       || column_name
       || '") like upper(''%'
       || :val
       || '%'')' ).extract ('ROWSET/ROW/*') ) ) t
ORDER  BY "Table"
/ 
30
задан starblue 17 June 2009 в 15:38
поделиться

3 ответа

При использовании autoconf можно использовать AC_C_BIGENDIAN макрос, который, как справедливо гарантируют, будет работать (установка эти WORDS_BIGENDIAN определяют по умолчанию)

поочередно, Вы могли попробовать что-то как следующее (взятый от autoconf) для получения теста, который будет, вероятно, оптимизирован далеко (GCC, по крайней мере, удаляет другое ответвление)

int is_big_endian()
{
    union {
        long int l;
        char c[sizeof (long int)];
    } u;

    u.l = 1;

    if (u.c[sizeof(long int)-1] == 1)
    {
        return 1;
    }
    else
        return 0;
}
19
ответ дан Hasturkun 17 June 2009 в 15:38
поделиться
  • 1
    IMO это - большой ответ. Последний абзац doesn' t должен осуждать его. – Moshe Weitzman 17 December 2016 в 14:35

Нет никакого портативного способа сделать это во время компиляции, Ваш лучший выбор состоит в том, чтобы, вероятно, использовать Повышение макросы порядка байтов или эмулировать методы, которые они используют.

18
ответ дан Robert Gamble 17 June 2009 в 15:38
поделиться
  • 1
    @AK делают это на частном ответвлении, и никто не должен знать, что Вы переписываете ГОЛОВУ – siride 19 September 2010 в 05:44

Хм, это - интересный Вопрос. Моя ставка - то, что это не возможно. Я думаю, что необходимо продолжить использовать макросы и пойти с BOOST_STATIC_ASSERT(!BIG_ENDIAN);, или static_assert в C++ 0x. Причина я думаю, что это вызвано тем, что endian'nes является свойством если Ваша среда выполнения. Однако static_assert рассматривают во время компиляции.

я предлагаю, чтобы Вы изучили код нового золото GNU компоновщик ELF. Ian Lance Taylor, его автор, использовал шаблоны, чтобы выбрать правильный порядок байтов во время компиляции, гарантировать оптимальную производительность во время выполнения. Он explicitely инстанцирует всех возможных порядков байтов, так, чтобы у него все еще была раздельная компиляция (не все шаблоны в заголовках) шаблонного определения и объявления. Его код превосходен.

5
ответ дан Johannes Schaub - litb 17 June 2009 в 15:38
поделиться
  • 1
    Это имеет гибкость выполнения так. Вы don' t должен использовать его, но it' s там, если Вам нужен он. – fseto 19 September 2010 в 02:45
Другие вопросы по тегам:

Похожие вопросы: