Вызов функции с аргументами без скобок в C?

Когда функция не имеет никакого аргумента, ее можно вызвать без круглых скобок, define как

 #define test test() 

Можно ли вызвать функцию с аргументом без paranthesis? Что-то вроде

 #define test test(char *arg) test "argument 1"; 

Это не будет возможно в C так, как вы. В §6.5.2 стандарта (C99) описываются постфиксные выражения и не имеет такого синтаксиса. Вызовы функций (§6.5.2.2):

Постфиксное выражение, за которым следуют скобки () содержащие возможно пустой список выражений, разделенных запятыми, является вызовом функции. Постфиксное выражение обозначает вызываемую функцию. Список выражений указывает аргументы функции.

Parens не являются необязательными, и им необходимо обернуть все аргументы, чтобы вам понадобился либо макрос функции (который требует парнеров на сайте «вызов»), либо две отдельные вещи (один для вставки стартового пазза, один для вставки закрывающего один).

Вы можете сделать:

 #define test puts( #define end ); #define int_proc int #define proc_body { #define proc_end } #define no_args (void) #include  int_proc main no_args proc_body test "hello" end proc_end 

Но действительно?

C ++ предлагает больше возможностей с перегрузкой оператора в частности. Возможно, вы захотите изучить это, если хотите «настроить» некоторый синтаксис.

Вот ужасный пример:

 #include  struct Foo { void operator=(char const* str) { std::cout << str << std::endl; } }; Foo global_foo; #define test global_foo = int main() { test "hello"; } 

Обратите внимание, что есть разумные подходы, которые могут оказаться привлекательными, например, class Qt qDebug . Схематически это происходит следующим образом:

 #include  struct debug { debug() {} ~debug() { std::cout << std::endl; } debug const& operator<<(char const* msg) const { std::cout << msg << " "; return *this; } }; 

Обычный способ его использования:

 debug() << "this" << "works"; 

Если вы добавите конструктор, который принимает char const* :

 debug(char const*msg) { std::cout << msg << " "; } 

Затем вы можете использовать буквенное обозначение и написать:

 (debug) "Hello"; 

Которая довольно близка к тому, что у вас было (и является макрозависимым).

Тогда вы можете получить фантазию со всеми другими операторами ( operator, будет основным кандидатом), но правила приоритета могут немного испортить веселье.