C/C++에서 typedefs에 #ifndef와 유사한 지시어가 있습니까?
값을 정의하지 않은 경우에만 값을 정의하는 경우 다음과 같이 수행합니다.
#ifndef THING
#define THING OTHER_THING
#endif
면 어쩌지THING
는 입니다.typedef
identifier, definedd identifier는 정의되지 않았습니까?는 이런 걸 싶어요.
#ifntypedef thing_type
typedef uint32_t thing_type
#endif
은 외부 확인하고 싶었기 입니다.boolean
좀 더 일반적인 해결책을 들을 수 있다면 좋을 텐데
언어에는 그런 것이 없고, 그럴 필요도 없다.단일 프로젝트 내에서 ODR 위반이므로 다른 유형을 참조하는 동일한 typedef 에일리어스를 가질 수 없습니다.또, 같은 타입에 대해서 같은 에일리어스를 작성하는 경우는, 그것을 실행해 주세요.이 언어에서는 원하는 횟수만큼 동일한 typedef를 실행할 수 있으며, 보통 특정 ODR(같은 변환 유닛 내)을 포착합니다.
typedef int myint;
typedef int myint; // OK: myint is still an alias to int
//typedef double myint; // Error: myint already defined as alias to int
typedef를 사용하여 어떤 기능을 사용할지 결정하는 경우 typedef가 아닌 템플릿을 참조해야 합니다.
는 C++의 존재를 .typedef
해서 수 게 좋아요,
#ifndef THING_TYPE_DEFINED
#define THING_TYPE_DEFINED
typedef uint32_t thing_type
#endif
편집:
@David의 코멘트가 맞다면, 이것은 어떻게 대답할 것인가?하지만 중요한 것은 그 이유를 놓치고 있다는 것이다.위의 방법으로 할 수 있습니다.모든 것을 하고 싶다면, 하지만 중요한 것은 어차피 할 필요가 없을지도 모릅니다.@David의 답변과 코멘트가 자세한 내용을 설명하고 있기 때문에 질문에 올바르게 대답할 수 있다고 생각합니다.
아니요, 전처리 단계에서 C++에는 이러한 기능이 없습니다.할 수 있는 한에서는
#ifndef thing_type
#define thing_type uint32_t
#endif
비록 이것은 좋은 코딩 연습은 아니지만 나는 그것을 제안하지 않는다.
(「」등).#define
에 대해 수 한 텍스트 도구입니다는 프로그래밍 언어에 대해 전혀 모르기 때문에 언어 수준의 정의에 따라 동작할 수 없는 조잡한 텍스트 대체 도구입니다.
유형이 한 번만 정의되도록 하려면 다음 두 가지 방법이 있습니다.
- 각 정의가 제자리를 가지도록 코드를 구성하며, 여러 정의가 필요하지 않습니다.
#define
하고, 「」를 사용합니다.#ifndef
유형을 정의하기 전에 매크로 정의를 확인합니다.
첫 번째 옵션은 일반적으로 보다 유지보수가 용이한 코드로 이어집니다.두 번째 프로그램에서는 실수로 한 프로그램 내에서 다른 유형의 정의가 나타날 경우 미묘한 버그가 발생할 수 있습니다.
이미 말한 것처럼 그런 것은 없지만 다른 유형의 에일리어스를 작성하려고 하면 컴파일 오류가 발생합니다.
typedef int myInt;
typedef int myInt; // ok, same alias
typedef float myInt; // error
단, typedef가 정의되어 있는 곳을 찾기 위한 ctag라는 것이 있습니다.
문제는 실제로 PITA입니다.일부 API나 SDK는 일반적으로 사용되는 것을 재정의하기 때문입니다.지도 처리 소프트웨어(GIS)용 헤더 파일이 TRUE와 FALSE(Windows SDK에서 일반적으로 사용) 키워드를 true와 false 키워드(분명히 뭔가 깨질 수 있음)가 아닌 정수 리터럴로 재정의하고 있는 것이 문제였습니다.그리고 유명한 농담인 "#define true false"도 관련이 있습니다.
define은 C\C++ 코드로 선언된 typedef 또는 상수를 느끼지 않습니다.이는 프리프로세서가 코드를 분석하지 않고 #문만 스캔하기 때문입니다.구문 분석기에 전달하기 전에 코드를 수정합니다.그래서 일반적으로는 불가능합니다.
https://msdn.microsoft.com/en-us/library/5xkf423c.aspx?f=255&MSPPError=-2147217396 GCC에서 구현 요청이 있었지만 아직까지는 휴대할 수 없습니다.MSVC에서도 '확장'으로 간주됩니다.이것은 프리프로세서 문이 아닌 컴파일러 문이기 때문에 정의된 매크로를 "느끼지 않고" 함수 본문 밖에서 typedef만 검출합니다.여기서 "full type"은 "class SomeClass;"와 같은 문장은 무시하고 전체 정의에서 반응하는 것을 의미합니다.본인 부담으로 사용하세요.
편집: 현재 MacOS에서도 지원되고 있는 것 같습니다.또, -fms-dialect 플래그가 있는 인텔의 comiler에서도 지원되고 있습니다(AIX\Linux).
이것은 질문에 직접 답하지는 않지만 문제에 대한 가능한 해결책으로 작용할 수 있습니다.
이런 걸 해보는 게 어때요?
#define DEFAULT_TYPE int // just for argument's sake
#ifndef MY_COOL_TYPE
#define MY_COOL_TYPE DEFAULT_TYPE
#endif
typedef MY_COOL_TYPE My_Cool_Datatype_t;
그 후 유형을 커스터마이즈할 경우 이 위에 MY_COOL_TYPE을 정의하거나(이 헤더의 맨 위에 있는 "configure" 헤더에 포함), 컴파일할 때 명령줄 인수로 전달할 수 있습니다(GCC 및 LLVM에서도 이 작업을 수행할 수 있는 것으로 알고 있습니다.
아니, 네가 원했던 것 같은 건 없어.도서관도 그렇고 도서관도 그렇고typedefs
같은 것을 위해서bool
그들이 당신이 무엇에 쓰는지 신경 쓰지 않을 때 문제가 된다.bool
다른 입술도 같은 행동을 할 수 있다!!
그래서 내가 하는 일은 이렇다.그런 일을 하는 libs의 헤더 파일을 편집하여typedef bool
다음과 같은 코드를 추가합니다.
#ifdef USE_LIBNAME_BOOL
typedef unsigned char bool; // This is the lib's bool implementation
#else
#include <stdbool.h>
#endif
립스 자신의 립스를 사용하지 않을 경우 포함시켰습니다.bool typdef
즉, C99 이후가 필요합니다.
앞에서 설명한 바와 같이 C++ 표준에는 포함되지 않지만 자동 툴을 사용하여 동일한 기능을 사용할 수 있습니다.
매크로를 사용하여 bool이 정의되어 있는지 확인할 수 있습니다(또는 데이터 유형에 따라 다른 루틴).
최종적으로 사용한 솔루션은 stdbool.h를 포함한 것입니다.typedef가 이미 정의되어 있는지 확인하는 방법은 해결되지 않지만 부울 유형이 정의되어 있는지 확인할 수 있습니다.
좋은 질문입니다.C와 Unix는 과거가 있으며 Windows(shh Cygwin people) 등의 비 POSIX 플랫폼에서는 사용할 수 없는 Unix Ctypeef가 다수 존재합니다.이러한 시스템(shhh Cygwin people)간에 휴대 가능한 C를 쓰려고 할 때는, 이 질문에 어떻게 대답할지를 결정할 필요가 있습니다.
크로스 플랫폼의 이식성이 필요한 경우 컴파일 대상의 플랫폼 고유의 프리프로세서 매크로를 알면 도움이 될 수 있습니다.예: 창문에_WIN32
프리프로세서 매크로 정의 - 컴파일 대상이 32비트 ARM, 64비트 ARM, x86 또는 x64일 경우 1이 됩니다.그러나 존재감은 우리가 Windows 머신에 있다는 것을 알려줍니다.즉, 예를 들어 ssize_t
사용할 수 없습니다(ssize_t, size_t, size_t가 아닙니다).따라서 다음과 같은 작업을 수행할 수 있습니다.
#ifdef _WIN32
typedef long ssize_t;
#endif
그런데, 이 스레드에 있는 사람들은 비슷한 패턴에 대해 언급하고 있습니다. 이것은 공식적으로 가드라고 불립니다.다중 포함을 방지하기 위해 헤더 파일(즉, 인터페이스 또는 ".h" 파일)에서 많이 볼 수 있습니다.머리글 가드에 대해 듣게 될 거야
/// @file poop.h
#ifndef POOP_H
#define POOP_H
void* poop(Poop* arg);
#endif
이제 헤더 파일을 구현 파일에 포함할 수 있습니다.poop.c
기타 파일도 있습니다.main.c
헤더 가드 덕분에 컴파일이 항상 성공적이고 여러 개의 컴파일을 포함하지 않고 컴파일을 수행할 수 있습니다.
salty seadogs는 헤더 가드를 프로그래밍 방식으로 또는 C++11 함수 같은 매크로로 씁니다.책을 좋아하신다면 옌스 구스테드의 '모던 C'를 추천합니다.
투명하지는 않지만 typedef 없이(에일리어스만 사용하여) 한 번 컴파일하여 컴파일 여부를 확인할 수 있습니다.
그런 건 없어요.이 duplicate_typedef 컴파일러 오류를 비활성화할 수 있습니다."이미 (동일한 유형의) 정의 이름이 선언되었습니다."
한편 표준화된 typedef 정의의 경우 사용할 수 있는 bool에 대해 __bool_true_false_are_defined와 같이 정의된 프리프로세서 매크로가 있는 경우가 있습니다.
언급URL : https://stackoverflow.com/questions/6772802/in-c-c-is-there-a-directive-similar-to-ifndef-for-typedefs
'source' 카테고리의 다른 글
포인터가 C를 가리키고 있는 함수를 판별하고 있습니까? (0) | 2022.08.21 |
---|---|
C/C++ 문자 크기('a') (0) | 2022.08.21 |
Vue 렌더링 기능 내에서 하위 제어 (0) | 2022.08.21 |
삭제된 하위 구성 요소에서 이벤트 수신 중지 (0) | 2022.08.21 |
이것을 사용하는 것의 단점은 무엇입니까?vue 컴포넌트의 $root? (0) | 2022.08.21 |