2016-11-11 5 views
1

В JavaScript мы можем сделать следующее:передавая конкретной структуру поля в качестве параметра функции

var obj = {alpha: [1, 2, 3], omega:[1, 2, 3]}; 

function test(field) { 
    return obj[field]; 
} 

test("alpha"); 

Теперь им пытаются добиться того же в с использованием ЬурейиХ структур в C:

typedef struct FooBar{ 
    char alpha[50]; 
    char beta[50]; 
} FooBar; 

FooBar fooBar; 

int getTest(type field) { 
    return sizeof(fooBar.field); 
} 

getTest(alpha); 

ли это возможно как-то просто передать имя поля, как показано выше?

+0

Это похоже на решение, ищущее проблему ... зачем вам это нужно? Если вызывающий абонент уже знает, что вы ищете 'alpha', то вызывающий может также просто использовать' sizeof (foobar.alpha) 'вместо вызова абсолютно бессмысленной функции. – Lundin

ответ

4

Вы можете сделать это с помощью макроса:

#define getTest(t) sizeof(fooBar.t) 

typedef struct FooBar { 
    char alpha[50]; 
    char beta[50]; 
} FooBar; 

FooBar fooBar; 


int main() 
{ 
    int alphasize = getTest(alpha); 
} 

Но я не уверен, если это соответствует вашему требованию.

+0

Ни в коем случае, ничего себе. Почему это не работает с функциями? Довольно потрясающий трюк – Asperger

+0

Он действительно заполняет мое требование. Не могли бы вы добавить дополнительную информацию? Как и почему это работает здесь – Asperger

+1

Это работает, потому что макросы не являются функциями. Макросы заменяются текстовым образом до фактической компиляции. Здесь каждый раз, когда вы пишете 'getTest (что-то)', это похоже на то, что вы написали 'sizeof (foobar.something)'. –

1

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

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

+0

штопать его. Это так неудачно. Есть ли обходной путь? – Asperger

1

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

Вы должны были бы использовать отдельные функции для каждого элемента, такие как

size_t getAlphaSize(void) { 
    return sizeof(fooBar.alpha); 
} 

отметить также, что sizeof возвращает значение без знака типа size_t, а не как int.

+0

Хорошо, так это единственный способ, да. Дарн, я подумал, что был более элегантный способ: ( – Asperger

+0

ok хорошо знать:) – Asperger

Смежные вопросы