내 C++ 지식 (또는 부족)에서 간단히 말해서 FOO는 이것이 정의되었을 때 괄호 안에있는 것으로 대체 될 것입니다. 그러나 괄호가 비어 있다면 어떻게됩니까? 0과 동등한가요? 즉 #ifdef foo (0)
은 #ifdef foo ()
과 동일한 작업을 수행 할 예정입니까? 동등한 경우 빈 괄호로 사용할 유용한 효과가 있습니까?빈 괄호가있는 정의에서는 어떻게됩니까? 예 : #define FOO()?
답변
이 매크로 확장 단지 어떤으로 확대 할 만지지 않는다, 아무것도 FOO()
대체 완벽하게 괜찮습니다 (그리고 헤더 파일에 L/R/l/r 매크로를 숨기면 아무도 당신이 한 일을 이해할 수 없습니다.) 적어도 일부 지역에서는 매크로가 실제로 확장되도록 보장해야합니다.
이 문
#ifdef CRAPFOO()
(GCC에서 "#ifdef와의 마지막에 추가 토큰", 다른 컴파일러는 다른 오류를 제공 할 수 있습니다.
#define CRAPFOO()
#ifdef CRAPFOO
do something
#else
not something
#endif
는 다음과 같이 do something
을 줄 것이다 깨끗하게 컴파일되지 않습니다 결과.
#define
은 절대 바보 같은 텍스트 대체품입니다. 그래서 :
#define FOO()
int main()
{
FOO;
}
는 "단지 전처리 않는다"즉, (내가 너무 clang
생각)
int main()
{
();
}
당신은 g++
에 -E
옵션을 사용하여이 문제를 테스트 할 수 있습니다되고, 또는 동등, 다만 cpp
을 실행 도구, c 전 처리기입니다. 즉
$ echo -e "#define FOO()\nint main()\n{\n FOO;\n}" > def.cpp ; g++ -E def.cpp
# 1 "def.cpp"
# 1 "<command-line>"
# 1 "def.cpp"
int main()
{
();
}
(이 리눅스/유닉스 명령 행 도구입니다).
'#define FOO()'와'#define FOO()'의 차이점에 유의하십시오. 나는'#define FOO()'를 본 적이 없다고 생각하지만'#define FOO()'가 빈번하다. –
#define
은 전 처리기 지시문이며 실제로 코드를 컴파일하기 전에 이 발생하는 바보 같은 텍스트 교체 규칙입니다. 매크로 정의를 적용 할 때 아직 코드 모델이 없습니다.
#define FOO()
은 ()
와 FOO
의 모든 발생을 대체합니다.
#define FOO (0)
은 (0)
와 FOO
의 모든 발생을 대체합니다.
#define FOO 0
은 하지 동일한 (0)
등 (이 차이가있는 경우가있다)이다 0
와 FOO
의 모든 발생을 대체한다.
#include <stdio.h>
#define L (
#define R)
#define l {
#define r }
#define LR()
int main LR
l
printf L "Hello, World\n" R;
return 0;
r
하는 컴파일 것이다 그러나
,
#define FOO()
매크로가 확장 FOO
- 1. #define foo() do {} while (0)
- 2. #define FOO (x) 막대, x 정의에서 결코 참조되지 않은, 어떻게됩니까?
- 3. #define in #define; 전처리 기는 어떻게됩니까?
- 4. 빈 괄호가있는 Perl 모듈 사용
- 5. 여러 개의 괄호가있는 매크로
- 6. #define
- 7. 괄호가있는 ColdFusion 변수 이름
- 8. #DEFINE,
- 9. #DEFINE
- 10. var foo = foo || 경고 (foo);
- 11. 왜 "foo = foo || {};"입니까? 작동하지?
- 12. define 문에 define 문을 사용합니다.
- 13. 괄호가있는 트리 순회
- 14. 괄호가있는 문자열 건너 뛰기
- 15. CodeIgniter 괄호가있는 활성 레코드
- 16. 주위에 괄호가있는 문자열 반환
- 17. pgSQL에 괄호가있는 오류
- 18. PHP - 괄호가있는 단순 조건
- 19. ES6 괄호가있는 화살표 기능
- 20. 괄호가있는 jquery 객체
- 21. #define 지시문의 정적 변수
- 22. 빈 대리자에게 할당 된 이벤트 선언
- 23. 차이점 Foo * foo; 그리고 Foo foo; C++에서
- 24. ($ foo)와 (foo $ foo)와의 차이점은
- 25. $ (" '+ foo +"' ") vs $ (foo)
- 26. postgres와 sqlalchemy : 괄호가있는 열이있는 테이블에 삽입
- 27. 다시 작성 index.php? foo = bar & bar = foo to index.php? foo = bar & bar = foo
- 28. Git : repo에 빈 디렉토리가 있습니다. 어떻게됩니까?
- 29. 세션 빈 패시베이션 이후에 인젝션은 어떻게됩니까?
- 30. 빈 포장 솔루션 :이 문제는 어떻게됩니까?
Petersson 당신은 남자입니다. 예를 들어 주셔서 감사합니다. 또한 당신은이 질문을하기 위해 나를 여기에 데려다 준 문제를 예상했으며 어떤 일이 일어 났는지에 대해서도 대답했습니다. 그래서 예, gcc는이 정의에서 오류를 throw합니다. 또한 나는 그것이 어떤 가지로 들어갈 지 이해하지 못했습니다. – Palax