-g가 지정되면 gcc는 정의되는 것이 있습니까?
잠시 후 gcc(또는 g++) 여부를 알고 싶습니다.C에 필요하지만, c++)에 대해서도 궁금한 점이 있습니다.-g
이네이블입니다.그런가요?그렇다면 어떤 기호입니까?
검색 과정에서 다음과 같은 사실을 알게 되었습니다.
_DEBUG
수동으로 정의됩니다(수동으로 정의됨).-D_DEBUG
Visual C 프로그래머로부터 얻은 습관입니다(VC가 정의하기 때문에)._DEBUG
디버깅 모드로 컴파일 할 때)NDEBUG
디버깅 모드가 아닌 경우 정의됩니다.몇 군데 발견했는데, gcc와 g++를 .c와 .cpp 파일로 사용해보니, 있든 없든 그 어느 것에도 없습니다.-g
정의된 기호는 없습니다!
편집: 비표준 기호를 사용하지 않는 이유를 설명하겠습니다.
다른 커널 모듈에 헤더 파일을 포함시켜 이 모듈에 연결할 수 있도록 하는 커널 모듈을 상상해 보십시오.
이제 기능으로서 헤더 파일 중 하나에 있습니다.
#ifdef DEBUG <-- This is what I need
#define LOG(x, ...) printk("Some extra info"x, ##__VA_ARGS__);
#else
#define LOG(x, ...) printk("Without extra info"x, ##__VA_ARGS__);
#endif
이 이름은 실제로는LOG
예를 들어 보겠습니다.
이제 어떤 기호든 사용할 수 있습니다.DEBUG
누군가 내 헤더를 포함하면 그 기호를 정의하지 못할 수도 있어요물론 "헤더를 디버깅모드로 가져오려면 이 다른 기호를 정의해야 합니다"라고 말할 수 있지만, 이 심볼은 적절하지 않습니다.
헤더에 기호를 정의하고 모든 헤더 파일에 포함할 수 있습니다.이렇게 하면 내 헤더 중 하나가 포함된 경우 디버깅 기호도 표시됩니다.문제는 디버깅 모드로 컴파일하지 않을 경우 헤더가 디버깅모드라고 생각한다는 것입니다.
그래서 제가 생각하는 가장 좋은 방법은 다음과 같이 정의된 기호를 사용하는 것입니다.-g
사용되고 있는 경우!
갱신하다
지금까지 저는 다음과 같은 일을 할 수 있다는 결론에 도달했습니다.
방법_구축 방법
#if !defined(NDEBUG)
#define MY_DEBUG
#endif
사용방법:
#include "how_to_build.h"
#ifdef MY_DEBUG
// rest of the story
이와 같이, 일반적인 옵션은NDEBUG
정의도 삭제합니다.디버깅 모드로 헤더를 취득하지 않으면 정의하도록 지시해야 합니다.
다음과 같은 플래그 조합에 대해 gcc/g++가 정의하는 모든 매크로 목록을 볼 수 있습니다.
$ g++ -E -dD -xc++ /dev/null
예를 들어 다음과 같습니다.
[max@truth ~]$ g++ -E -dD -xc++ /dev/null > a
[max@truth ~]$ g++ -E -dD -xc++ -g -O3 /dev/null > b
[max@truth ~]$ diff a b
1a2
> # 1 "/home/max//"
173c174
< #define __NO_INLINE__ 1
---
> #define __OPTIMIZE__ 1
과연?-g
는 다음 중 하나를 정의합니다.
[max@truth ~]$ g++ -E -dD -xc++ -g /dev/null > c
[max@truth ~]$ diff a c
1a2
> # 1 "/home/max//"
추가 프리프로세서 디렉티브는 있지만 추가 매크로 없음-g
플래그를 설정합니다.
이는 의미가 있습니다.-g
는 code-gen에는 영향을 주지 않습니다.오브젝트 파일 메타데이터(메타데이터 기호)에만 영향을 줍니다.
-O0
디버깅을 일관되게 하기 위한 "disclating mode" code-gen 입니다.-Og
(이 답변은 gcc나 clang과 같은 컴파일러가 무엇을 의미하는지 자세히 설명합니다.모든 변수는 모든 문 뒤에 메모리 위치에 저장하고 문장은 최적화하지 마십시오.)
-O3
★★★★★★★★★★★★★★★★★」-g
는 직교입니다(최적화된 코드를 디버깅할 때 일부 변수에 대해 "최적화된 출력"을 얻을 수 있으며 소스 라인 간에 실행이 점프하는 것을 제외합니다).
다른 사용자가 말했듯이 매뉴얼에서 알 수 있듯이 GCC는 디버깅 정보가 생성되는지 여부를 나타내는 고유 매크로를 제공하지 않습니다(-g
덧붙이고 싶은 것은, 이것은 의도적인 것입니다.
오래 전에 GCC의 원저작자(RMS, Kenner, 아마도 다른 몇 가지)는 디버깅 정보를 활성화하여 실제 코드에 어떠한 변경도 일으키지 않아야 하며 디버깅을 시도할 때 이상하게도 버그가 사라질 위험을 줄일 수 있다고 결정했습니다.이것은 GCC의 기반암 설계 원칙이며, 오늘날에도 개발자들은 이를 유지하기 위해 많은 노력을 기울이고 있습니다.
가 「스스로」에 에, 이 설계 됩니다. 왜냐하면 매크로가 소스 코드 자체를 변경할 수 있기 때문입니다.-g
.
.
g++ -E -dD -xc++ /dev/null
discloss.
g++ -E -dD -g -xc++ /dev/null
에 추가 정의된 기호는 표시되지 않습니다.
이는 기호가 정의된다는 것을 명시하는 문서가 없는 것과 결합되어 아무것도 정의되지 않았다고 안전하게 말할 수 있을 것이다.
언급URL : https://stackoverflow.com/questions/7998100/does-gcc-define-anything-when-g-is-specified
'programing' 카테고리의 다른 글
노드용 파일을 포함합니다.JS(vue) (0) | 2022.07.13 |
---|---|
가치 없는 Vue 컴포넌트 소품 (0) | 2022.07.13 |
Vue.js에서 백엔드 API 데이터 값이 변경될 경우 프런트엔드를 자동으로 업데이트하려면 어떻게 해야 합니까? (0) | 2022.07.13 |
VueJS jQuery: 상위 데이터 특성의 계산된 값이 정의되지 않았습니다. (0) | 2022.07.13 |
Vuex와의 양방향 바인딩 (0) | 2022.07.13 |