Ошибка компиляции C «вызываемый объект не является функцией или указателем на функцию»

Я получил фрагмент кода C из Интернета и пытаюсь его скомпилировать. Я получаю следующую ошибку.

error: expected declaration specifiers or '...' before ')' token
    6 | extern FUNC(void, MY_CODE) MyLatestUpdate()(void);
      |                          ^
ERROR!
/tmp/RkrMFH0deT.c: In function 'main':
/tmp/RkrMFH0deT.c:11:41: error: called object is not a function or function pointer
   11 | #define STD_ON                          1u
      |                                         ^~

Ниже приведен фрагмент кода

В файле .h

#define MY_CODE

extern FUNC(void, MY_CODE) MyLatestUpdate()(void);

В другом файле .h

#define MyLatestUpdate()    MyPreValue()
#define MyPreValue()        UPDATE_VALUE
#define UPDATE_VALUE        STD_ON
#define STD_ON              1u

в файле .c

int main() {
    // Write C code here
    MyLatestUpdate()();
    printf("test code");
    return 0;
}

Кажется, я получаю ошибку в файле .h.

extern FUNC(void, MY_CODE) MyLatestUpdate()(void);

error: expected declaration specifiers or '...' before ')' token

Функция объявлена ​​как указатель на функцию или как макрос функции? Как я могу решить эти проблемы? Любая помощь

Получите фрагменты кода из другого источника. Это просто ужасно. Проверьте, есть ли у вашего компилятора возможность отображать выходные данные препроцессора.

gnasher729 22.08.2024 12:05

Те дни, когда вы ищете код в Интернете, а не проектируете и не кодируете самостоятельно, а затем выбираете странный код, а затем вам приходится устранять всевозможные предупреждения и ошибки, которые он вызывает!

WedaPashi 22.08.2024 12:07

Я уверен, что сейчас пьян, но на самом деле MyLatestUpdate()(); не буду 1u();, что и вызывает ошибку "called object is not a function or function pointer." ? Мне это кажется ясным как божий день.

WedaPashi 22.08.2024 12:12

@WedaPashi Если вы это читаете, значит, вы трезвы. Если бы вы написали такой код, я бы заподозрил, что вы пьяны :-)

gnasher729 22.08.2024 12:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
4
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

MyLatestUpdate преобразуется препроцессором в 1u. Вы пытаетесь скомпилировать

extern FUNC (void, ) 1u()(void);

Что является полной ерундой.

Как передать функцию вместо 1u?

user2986042 22.08.2024 12:16

1/ Напишите функцию, которая не является случайной сборкой мусора препроцессора, а просто функцией. 2/ Напишите новый вопрос, который объясняет, чему вы хотите передать эту функцию и чего вы пытаетесь достичь.

Useless 22.08.2024 12:22

@user2986042 user2986042 При вызове функции, которая принимает указатель на функцию в качестве аргумента, вы передаете имя функции, см. мой ответ

Wolf 22.08.2024 14:59

Объявления функций

Современное объявление функции на C, по крайней мере, укажет

  • тип возвращаемого значения или void
  • имя
  • типы аргументов с их (необязательными) именами или void

Спецификация привязки extern подразумевается для объявлений функций. Возвращаемое значение отсутствует (что приемлемо до C23), но запятая после спецификации параметра void синтаксически неверна.

Макросы препроцессора

В вашем примере MY_CODE определен, но не имеет текста для замены (который можно использовать для ветвления в препроцессоре для создания вариантов кода). Поэтому будет сложно продуктивно использовать его между запятой и закрывающей скобкой в ​​C. С другой стороны, вы также можете включать запятые в определения макросов.

Указатели на функции (в качестве аргументов)

Из вашего комментария к принятому ответу я прочитал, что вы пытаетесь вызвать функцию с указателем на функцию в качестве аргумента. Указатели на функции выглядят немного сложно, поэтому их часто делают более доступными с помощью typedef:

/* translate1: pointer to a function that takes and returns a char */
char (*translate1)(char);

/* translate_function_t is a name for above function type 
   translate2 is again a pointer to a function that takes and returns a char
*/
typedef char (*translate_function_t)(char);
translate_function_t translate2;

/* transliterate: replaces each char in str by calling your_translate */
void transliterate(char* str, translate_function_t your_translate);

Функция transliterate в приведенном выше примере принимает аргументы указателя функции во втором параметре your_translate.

Простой пример указателя функции

#include <stdio.h>

/* translate_function_t: pointer to a function that takes and returns a char */
typedef char (*translate_t)(char);

/* transliterate: replaces each char in str by calling translate */
void transliterate(char* str, translate_t translate);

char my_trans(char a)
{
    if (a == 'x')
        return 'u';
    if (a == 'u')
        return 'x';
    return a;
}

void transliterate(char* str, translate_t translate)
{
    while (*str) {
        *str = translate(*str);
        str++;
    }
}

int main()
{
    char msg[] = "Hello world! (xu)";
    printf("%s\n", msg);
    transliterate(msg, my_trans);
    printf("%s\n", msg);
    return 0;
}

Другие вопросы по теме