Я получил фрагмент кода 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
Функция объявлена как указатель на функцию или как макрос функции? Как я могу решить эти проблемы? Любая помощь
Те дни, когда вы ищете код в Интернете, а не проектируете и не кодируете самостоятельно, а затем выбираете странный код, а затем вам приходится устранять всевозможные предупреждения и ошибки, которые он вызывает!
Я уверен, что сейчас пьян, но на самом деле MyLatestUpdate()();
не буду 1u();
, что и вызывает ошибку "called object is not a function or function pointer."
? Мне это кажется ясным как божий день.
@WedaPashi Если вы это читаете, значит, вы трезвы. Если бы вы написали такой код, я бы заподозрил, что вы пьяны :-)
MyLatestUpdate преобразуется препроцессором в 1u. Вы пытаетесь скомпилировать
extern FUNC (void, ) 1u()(void);
Что является полной ерундой.
Как передать функцию вместо 1u?
1/ Напишите функцию, которая не является случайной сборкой мусора препроцессора, а просто функцией. 2/ Напишите новый вопрос, который объясняет, чему вы хотите передать эту функцию и чего вы пытаетесь достичь.
@user2986042 user2986042 При вызове функции, которая принимает указатель на функцию в качестве аргумента, вы передаете имя функции, см. мой ответ
Современное объявление функции на 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;
}
Получите фрагменты кода из другого источника. Это просто ужасно. Проверьте, есть ли у вашего компилятора возможность отображать выходные данные препроцессора.