전 처리기 ##을 사용하여 동적으로 함수 호출

데이비드 542

라는 함수가 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();
}
tstanisl

이런 식으로 할 수 없습니다. C 전처리 기는에 대해 알지 못합니다 _Generic. 일반 이름, 추가 확장의 잠재적 인 후보로 취급됩니다.

그러나 _GenericNewObj 매크로 정의에 사용할 수 있습니다 . 문제는 인수 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

exec ()를 사용하여 동적으로 비동기 함수 호출

분류에서Dev

setTimeout을 사용하여 재귀 적으로 함수 호출

분류에서Dev

정수 값을 기반으로 동적으로 함수 호출

분류에서Dev

테이블이 ajax 호출을 사용하여 동적으로로드되면 Javascript 함수 호출

분류에서Dev

Javascript / React 함수 내부의 문자열을 사용하여 함수 / 변수를 동적으로 호출

분류에서Dev

사전을 사용하여 문자열에서 함수 호출

분류에서Dev

C ++ 20에서 상호 배타적 인 함수 호출을위한 전 처리기 방지

분류에서Dev

dplyr 및 NSE를 사용하여 다양한 인수로 함수 호출을 동적으로 구성

분류에서Dev

파이썬 함수는 이름을 저장하는 사전을 사용하여 서로를 재귀 적으로 호출합니다.

분류에서Dev

개체 매개 변수 값을 사용하여 동적으로 powershell cmdlet 호출

분류에서Dev

호출하기 전에 Angular 메서드 이름을 동적으로 생성

분류에서Dev

Python 다중 처리 : 변수 전달을 사용하여 다른 스크립트에서 다중 처리로 모듈 호출

분류에서Dev

std :: condition_variable을 사용하여 동기화 된 함수 호출

분류에서Dev

함수 목록을 사용하여 C ++에서 비동기 호출

분류에서Dev

python3에서 사전을 사용하여 인수로 완료된 함수 호출

분류에서Dev

ajax 호출을 사용하여 javascript 함수에 PHP 변수를 전달하고 동일한 페이지에서 응답 텍스트 가져 오기

분류에서Dev

함수 호출로 사전을 수정하는 Python

분류에서Dev

IP 주소도 기본적으로 RestTemplate 호출을 사용하여 Http 헤더에 전달됩니까?

분류에서Dev

완료 처리기로 UIImageWriteToSavedPhotosAlbum ()을 호출하기 위해 정적 함수를 사용하는 방법은 무엇입니까?

분류에서Dev

프로토콜 적용을 사용하여 함수에서 호출되는 콜백 함수에 'this'객체를 전달하는 방법

분류에서Dev

사전을 사용하여 매개 변수가있는 함수 호출

분류에서Dev

mmap (2)와 같이 비동기 안전으로 정의되지 않은 함수가 신호 처리기에서 호출 된 다른 비동기 안전 함수에 영향을 줍니까?

분류에서Dev

ng-click, 단일 클릭을 사용하여 여러 함수를 호출하고 동일한 변수를 여러 함수에 전달 angularjs

분류에서Dev

SSH 원격 포트 전달을 사용하여 동적으로 할당 된 포트 번호 기록

분류에서Dev

재귀 적으로 비동기 함수를 호출하는 함수 대기

분류에서Dev

함수 / 처리기가 계층을 호출하지 않고 AWS Lambda 계층이 Lambda 함수 처리기를 가로 챌 수 있습니까?

분류에서Dev

함수 호출에 의해 생성 된 전역 변수는 기본적으로 빈 문자열을 포함하며 정의되지 않아야합니다.

분류에서Dev

Python : 변수를 동적으로 사용하여 클래스 인스턴스에서 사전 키 호출

분류에서Dev

AJAX 호출을 사용하여 자동 완성에서 한 함수에서 다른 함수로 변수 값 전달

Related 관련 기사

  1. 1

    exec ()를 사용하여 동적으로 비동기 함수 호출

  2. 2

    setTimeout을 사용하여 재귀 적으로 함수 호출

  3. 3

    정수 값을 기반으로 동적으로 함수 호출

  4. 4

    테이블이 ajax 호출을 사용하여 동적으로로드되면 Javascript 함수 호출

  5. 5

    Javascript / React 함수 내부의 문자열을 사용하여 함수 / 변수를 동적으로 호출

  6. 6

    사전을 사용하여 문자열에서 함수 호출

  7. 7

    C ++ 20에서 상호 배타적 인 함수 호출을위한 전 처리기 방지

  8. 8

    dplyr 및 NSE를 사용하여 다양한 인수로 함수 호출을 동적으로 구성

  9. 9

    파이썬 함수는 이름을 저장하는 사전을 사용하여 서로를 재귀 적으로 호출합니다.

  10. 10

    개체 매개 변수 값을 사용하여 동적으로 powershell cmdlet 호출

  11. 11

    호출하기 전에 Angular 메서드 이름을 동적으로 생성

  12. 12

    Python 다중 처리 : 변수 전달을 사용하여 다른 스크립트에서 다중 처리로 모듈 호출

  13. 13

    std :: condition_variable을 사용하여 동기화 된 함수 호출

  14. 14

    함수 목록을 사용하여 C ++에서 비동기 호출

  15. 15

    python3에서 사전을 사용하여 인수로 완료된 함수 호출

  16. 16

    ajax 호출을 사용하여 javascript 함수에 PHP 변수를 전달하고 동일한 페이지에서 응답 텍스트 가져 오기

  17. 17

    함수 호출로 사전을 수정하는 Python

  18. 18

    IP 주소도 기본적으로 RestTemplate 호출을 사용하여 Http 헤더에 전달됩니까?

  19. 19

    완료 처리기로 UIImageWriteToSavedPhotosAlbum ()을 호출하기 위해 정적 함수를 사용하는 방법은 무엇입니까?

  20. 20

    프로토콜 적용을 사용하여 함수에서 호출되는 콜백 함수에 'this'객체를 전달하는 방법

  21. 21

    사전을 사용하여 매개 변수가있는 함수 호출

  22. 22

    mmap (2)와 같이 비동기 안전으로 정의되지 않은 함수가 신호 처리기에서 호출 된 다른 비동기 안전 함수에 영향을 줍니까?

  23. 23

    ng-click, 단일 클릭을 사용하여 여러 함수를 호출하고 동일한 변수를 여러 함수에 전달 angularjs

  24. 24

    SSH 원격 포트 전달을 사용하여 동적으로 할당 된 포트 번호 기록

  25. 25

    재귀 적으로 비동기 함수를 호출하는 함수 대기

  26. 26

    함수 / 처리기가 계층을 호출하지 않고 AWS Lambda 계층이 Lambda 함수 처리기를 가로 챌 수 있습니까?

  27. 27

    함수 호출에 의해 생성 된 전역 변수는 기본적으로 빈 문자열을 포함하며 정의되지 않아야합니다.

  28. 28

    Python : 변수를 동적으로 사용하여 클래스 인스턴스에서 사전 키 호출

  29. 29

    AJAX 호출을 사용하여 자동 완성에서 한 함수에서 다른 함수로 변수 값 전달

뜨겁다태그

보관