Как сделать variadic макрос (переменное количество аргументов)

Из man bash, тогда, если PAGER меньше / time.

  If the time reserved word precedes a pipeline, the elapsed as well as user and system time consumed by its  exe-
  cution  are reported when the pipeline terminates.  The -p option changes the output format to that specified by
  POSIX.  The TIMEFORMAT variable may be set to a format string that specifies how the timing  information  should
   be displayed; see the description of TIMEFORMAT under Shell Variables below.

затем /TIMEFORMAT

         The  optional  l  specifies  a  longer  format, including minutes, of the form MMmSS.FFs.  The value of p
         determines whether or not the fraction is included.


         If this variable is not set, bash acts as if it had the value    

Если его можно изменить на что-то вроде

TIMEFORMAT= 

без l суммировать проще.

Обратите внимание, что формат также может зависеть от локали LANG:

сравнить

(LANG=fr_FR.UTF-8; time sleep 1)

и

(LANG=C; time sleep 1)

. В этом случае сумма может быть сделана с помощью внешний инструмент, такой как awk

awk '/^real/ {sum+=$2} END{print sum} ' times.txt

или perl

perl -aln -e '$sum+=$F[1] if /^real/; END{print $sum}' times.txt
\nreal\t%3R'

без l суммировать проще.

Обратите внимание, что формат также может зависеть от локали LANG:

сравнить

(LANG=fr_FR.UTF-8; time sleep 1)

и

(LANG=C; time sleep 1)

. В этом случае сумма может быть сделана с помощью внешний инструмент, такой как awk

awk '/^real/ {sum+=$2} END{print sum} ' times.txt

или perl

perl -aln -e '$sum+=$F[1] if /^real/; END{print $sum}' times.txt
\nreal\t%3lR\nuser\t%3lU\nsys%3lS'. If the value is null, no timing information is displayed. A trailing newline is added when the format string is displayed.

Если его можно изменить на что-то вроде

TIMEFORMAT= 

без l суммировать проще.

Обратите внимание, что формат также может зависеть от локали LANG:

сравнить

(LANG=fr_FR.UTF-8; time sleep 1)

и

(LANG=C; time sleep 1)

. В этом случае сумма может быть сделана с помощью внешний инструмент, такой как awk

awk '/^real/ {sum+=$2} END{print sum} ' times.txt

или perl

perl -aln -e '$sum+=$F[1] if /^real/; END{print $sum}' times.txt
\nreal\t%3R'

без l суммировать проще.

Обратите внимание, что формат также может зависеть от локали LANG:

сравнить

(LANG=fr_FR.UTF-8; time sleep 1)

и

(LANG=C; time sleep 1)

. В этом случае сумма может быть сделана с помощью внешний инструмент, такой как awk

awk '/^real/ {sum+=$2} END{print sum} ' times.txt

или perl

perl -aln -e '$sum+=$F[1] if /^real/; END{print $sum}' times.txt
181
задан a3f 30 March 2015 в 16:10
поделиться

4 ответа

C99 путь, также поддерживаемый VC ++ компилятор.

#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)
283
ответ дан Alex B 23 November 2019 в 06:09
поделиться

Я не думаю, что это возможно, Вы могли фальсифицировать его с двойным parens... столь же долго Вам не нужны аргументы индивидуально.

#define macro(ARGS) some_complicated (whatever ARGS)
// ...
macro((a,b,c))
macro((d,e))
25
ответ дан eduffy 23 November 2019 в 06:09
поделиться
#define DEBUG

#ifdef DEBUG
  #define PRINT print
#else
  #define PRINT(...) ((void)0) //strip out PRINT instructions from code
#endif 

void print(const char *fmt, ...) {

    va_list args;
    va_start(args, fmt);
    vsprintf(str, fmt, args);
        va_end(args);

        printf("%s\n", str);

}

int main() {
   PRINT("[%s %d, %d] Hello World", "March", 26, 2009);
   return 0;
}

Если компилятор не понимает variadic макросы, можно также разделить ПЕЧАТЬ с любым из следующего:

#define PRINT //

или

#define PRINT if(0)print

Первое комментирует инструкции по ПЕЧАТИ, второе предотвращает инструкцию по ПЕЧАТИ из-за ПУСТОГО УКАЗАТЕЛЯ если условие. Если оптимизация установлена, компилятор должен разделить, никогда не выполнял инструкции как: если (0) печать ("привет мир"); или ((пусто) 0);

10
ответ дан jpalecek 23 November 2019 в 06:09
поделиться

объясненный для g ++ здесь, хотя это - часть C99 так, должен работать на всех

http://www.delorie.com/gnu/docs/gcc/gcc_44.html

быстрый пример:

#define debug(format, args...) fprintf (stderr, format, args)
4
ответ дан DarenW 23 November 2019 в 06:09
поделиться
Другие вопросы по тегам:

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