라는 함수가 create_car
있습니다. 을 수행하여 함수를 호출 할 수 있도록 전 처리기 매크로를 사용하려고합니다 Create(car)
. 지금까지 내가 가진 것은 다음과 같습니다.
#define ObjName(X) _Generic((X), struct Person: "person", struct Car: "car")
#define NewObj(X) create_ ## ObjName(X)
struct Car* create_car(void)
{
// do something here
}
struct Car {
char* make;
char* model;
int year;
void (*print)(struct Car*);
};
int main(void)
{
struct Car *car = NewObj(struct Car);
}
그러나 그것을 시도하면 다음과 같은 오류가 발생합니다.
gen.c:5:21: warning: implicit declaration of function ‘create_ObjName’; did you mean ‘create_car’? [-Wimplicit-function-declaration]
#define NewObj(X) create_ ## ObjName(X)
^
gen.c:40:5: note: in expansion of macro ‘NewObj’
NewObj(struct Car);
^~~~~~
gen.c:40:12: error: expected expression before ‘struct’
NewObj(struct Car);
^
gen.c:5:40: note: in definition of macro ‘NewObj’
#define NewObj(X) create_ ## ObjName(X)
매크로에서 개체를 만들려고 할 때 위의 문제는 무엇입니까?
전처리 / 컴파일 된 후 코드가 될 코드는 다음과 같습니다.
int main(void)
{
struct Car *car = create_car();
}
이런 식으로 할 수 없습니다. C 전처리 기는에 대해 알지 못합니다 _Generic
. 일반 이름, 추가 확장의 잠재적 인 후보로 취급됩니다.
그러나 _Generic
NewObj 매크로 정의에 사용할 수 있습니다 . 문제는 인수 NewObj(X)
가 값이 아니라 유형이라는 것입니다. 그러나 X
적절한 생성자 함수를 찾기 위해 NULL 포인터를 디스패치하여 우회 할 수 있습니다 .
#define NewObj(X) _Generic(((X*)0), struct Person*: create_person(), struct Car*: create_car())
단순화 된 결과 코드는 다음과 같습니다.
#include <stdio.h>
struct Car;
struct Person;
struct Car* create_car(void) {
puts("Create a car");
return NULL;
}
struct Person* create_person(void) {
puts("Create a person");
return NULL;
}
#define NewObj(X) _Generic(((X*)0), struct Person*: create_person(), struct Car*: create_car())
int main(void)
{
struct Car *car = NewObj(struct Car);
struct Person *person = NewObj(struct Person);
return 0;
}
예상대로 인쇄합니다.
Create a car
Create a person
어쨌든 더 읽기 쉽기 때문에 create_car()
/ create_person()
직접 호출하는 것이 좋습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다