c создание переменного аргумента - PullRequest
0 голосов
/ 13 марта 2012

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

AddSprintf(char* , ... )

Я хочу сделать ошибку времени компиляции, если кто-то вызывает ее без двух аргументов. В настоящее время, если кто-то звонит, как

AddSprintf("hello")

это работает. Но я хочу отключить вызов, как это. Есть ли способ, используя g ++, я могу заставить передачу аргумента?

Ответы [ 5 ]

7 голосов
/ 13 марта 2012

Перегрузка AddSprintf:

void AddSprintf(const char* , ... ) {}
void AddSprintf(const char*);

Тогда вы получите странное сообщение об ошибке при компиляции AddSprintf("hello")

Но имейте в виду, что в C ++ 11 вы должны использовать шаблоны с переменными значениями, потому что они безопасны от типов.

0 голосов
/ 13 марта 2012

Если вы хотите придерживаться того же имени, то вы можете использовать макрос переменной:

#define AddSprintf(X,...) AddSprintf(X,__VA_ARGS__)

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

0 голосов
/ 13 марта 2012

Как говорит 0A0D, это вариативно - по определению, компилятор будет в порядке с ним. Если вы хотите, чтобы он потерпел неудачу во время компиляции, вам, возможно, придется использовать хитрости - например, если вы проводите модульное тестирование, у вас есть код, который приводит к сбою функции с одним вызовом аргумента, чтобы новые программисты знали, что они не могут это сделать что.

Тем не менее, почему вы пытаетесь это сделать? Там может быть лучшее решение вашей проблемы.

0 голосов
/ 13 марта 2012

Вы не можете, правда. Точки означают «ноль или более аргументов», и нет способа узнать, есть ли аргументы. За исключением, возможно, использования ассемблера и некоторой проверки указателя стека.

0 голосов
/ 13 марта 2012

А как же

AddSprintf(char* , char*, ... ) 

...