문제

나는 이와 같은 매크로를 가지고 있습니다 (정확히는 아니지만 기능은 상당히 동일합니다) :

#define STRUCTMEMBER(Member,Value) GlobalStructInstance. ## Member = Value
...
STRUCTMEMBER(Item,1);

이것은 Visual C ++에서 완벽하게 작동하지만 GCC 3.4.5 (MingGW)는 다음과 같은 오류를 산출합니다.

붙여 넣기 "." "항목"은 유효한 전처리 토큰을 제공하지 않습니다.

이것은 "->"연산자를 사용할 때도 발생합니다. 나는이 연산자들의 사용이 금지되어 있다는 힌트를 찾지 못했습니다.

누구든지 아이디어가 있습니까?

도움이 되었습니까?

해결책

아마도 Visual C ++는 다른 공간을 만들기 위해 두 개의 공간을 함께 붙여있을 것입니다. 그 공백은 토큰이 아니지만 코드가 작동 할 수 있습니다.

object.member 토큰이 아니며 3 개의 토큰이므로 설명하는 매크로를 구현하기 위해 토큰을 포장 할 필요가 없습니다. '##'을 제거하면 어디서나 작동해야합니다.

EDIT : 방금 확인했으며 ##을 사용하여 유효한 토큰이 아닌 것을 형성 한 결과는 정의되지 않았습니다. 그래서 GCC는 그것을 거부 할 수 있고 MSVC는 내가 알 수있는 한 그것을 무시하고 페이스트를 수행 할 수 없습니다.

다른 팁

C 표준에 따르면,##'사전 처리 연산자는'사전 처리 토큰 '이어야하거나 결과가 정의되지 않아야합니다 (C99 6.10.3.3 (3) - ## 연산자).

전처리 토큰 목록은 (C99 6.4 (3) - 어휘 요소) :

헤더 이름, 식별자, 전처리 번호, 캐릭터 상수, 문자열 리터럴, 구두점 및 단일 비 백색 공간 문자는 다른 전처리 토큰 범주와 어휘와 일치하지 않는 단일 비 백색 공간 문자입니다.

GCC는 당신이 정의되지 않은 영토에 들어가고 있음을 알려줍니다. MSVC는 정의되지 않은 결과에 조용히 만족합니다 (이것은 당신이 거의 일어날 것으로 예상되는 것입니다).

어쨌든 단일 토큰을 만들지 않으면 토큰 붙여 넣기 연산자가 필요하지 않습니다. 일반적으로 (예외가있을 것입니다), 공백으로 분리 된 2 개의 토큰은 예에서와 같이 공백으로 분리되지 않은 2 개의 토큰과 같습니다.

로부터 GCC C 전 처리기 문서:

그러나 함께 유효한 토큰을 형성하지 않는 두 개의 토큰은 함께 붙여 넣을 수 없습니다.

구조. 멤버는 단일 토큰이 아닙니다.

이 경우 ## (토큰 연결) 연산자를 사용할 필요가 없습니다. 당신은 그것을 제거 할 수 있습니다. 다음은 Linux에서 GCC 4.2.4로 테스트 한 예입니다.

#include <stdio.h>

#define STRUCTMEMBER(Member, Value) GlobalStructInstance.Member = Value

struct {
    const char* member1;
}GlobalStructInstance;

int main(void)
{

    STRUCTMEMBER(member1, "Hello!");

    printf("GlobalStructInstance.member1 = %s\n",
           GlobalStructInstance.member1);

    return 0;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top