Как захватить объявление структуры в функции - PullRequest
0 голосов
/ 18 января 2019

У меня есть следующий код c:

struct {
    short s;
    int n;
} variableName;

Я хочу написать функцию для захвата этой переменной, вот так

void func(MyStruct* var){
    //do stuff
}

func(&variableName);

Я хотел бы сделать это без предоставления определения структуры. Есть ли способ перехватить variableName?

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Полностью пропущен "Я хотел бы сделать это, не предоставляя определения для структуры. Есть ли способ перехватить variableName?" в OP, если только он не был отредактирован после. Теперь этот вопрос не имеет смысла, но он показывает, как обычно можно передать структуру функции для будущих читателей.

#include <stdio.h>

    struct StructName{
        short s;
        int n;
    };

    void func(struct StructName struct_var){
            printf("Param values are: %4X %4X\n", struct_var.s & 0xFFFF, struct_var.n & 0xFFFF);
        }

    int main(){
        struct StructName struct_var;
        struct_var.s = 0xDEAD;
        struct_var.n = 0xBEEF;
        func(struct_var);
    }

// Похоже, вы пытаетесь использовать определение в качестве переменной. Здесь определение - StructName, а переменная - struct_var.

этот пример кода выводит: Значения параметров: DEAD BEEF

0 голосов
/ 18 января 2019

Если вы используете clang или gcc, вы можете использовать typeof:

struct foo {
    struct {
        int i;
    } anon;
} foo;

void do_something(typeof(foo.anon)* member) {
    member->i = 1;
}

Если нет глобального экземпляра вашего типа, вы можете использовать typeof((struct foo){}.anon).

Это имеет много минусов. Наиболее очевидные из них:

  • это не стандартно и связывает вас с clang / gcc
  • это чертовски ужасно
  • в любом случае он может вести себя не так, как вы ожидаете

Например, структурно-эквивалентные анонимные типы не имеют одинаковый тип, поэтому примерно так:

struct foo {
    struct {
        int i;
    } anon1;
    struct {
        int i;
    } anon2;
} foo;

anon1 и anon2 имеют разные типы, это означает, что typeof один из них не может использоваться для обозначения обоих.

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

Хотя это не особенно красиво и не совместимо с C ++, C помещает имя вложенных объявлений в глобальное пространство имен, так что это переносимо, и это не очень большое изменение кода для фронтальной загрузки:

struct {
    struct not_anon {
        int i;
    } anon;
} foo;

void do_something(struct not_anon* member) {
    member->i = 1;
}
0 голосов
/ 18 января 2019

Нет, вы не можете передать "анонимную" структуру в функцию в C. Конечно, вы можете определить свою функцию, чтобы она принимала аргументы индивидуально:

void func(short s, int n) { ... }

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

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

(Я не уверен, что вы, возможно, спрашиваете о несколько более эзотерической идее, которая заключается в том, чтобы скрыть композицию структуры и передать «непрозрачный дескриптор» из и в API. Существуют способы структурировать это в Си, но, пожалуйста, скажи, если ты об этом говоришь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...