typedef와define 혼용으로 인한 오류
typedef와define 혼용으로 인한 오류
최근에 코드를 쓰는 과정에서 컴파일이 항상 지나갈 수 없는 문제를 발견했는데 다음과 같은 오류를 보고했다.stdint.h:120:28: error: duplicate 'unsigned'
stdint.h:120:28: error: 'long long long' is too long for GCC
stdint를 엽니다.h 이 파일은 120줄의 내용을 발견했습니다.#if __have_long64
typedef signed long int64_t;
typedef unsigned long uint64_t;
#define __int64_t_defined 1
#elif __have_longlong64
typedef signed long long int64_t;
typedef unsigned long long uint64_t;
#define __int64_t_defined 1
#elif __STDINT_EXP(INT_MAX) > 0x7fffffff
typedef signed int int64_t;
typedef unsigned int uint64_t;
#define __int64_t_defined 1
#endif
계속 검색하여 코드의 헤더 파일에 다음과 같은 정의가 있음을 확인하십시오.#ifndef uint64_t
#define uint64_t unsigned long long
#endif
이 헤더 파일에서 위의 세 줄을 주석한 후include에서 컴파일합니다.
이 헤더 파일의 이름을 a.h로 하면 C 파일에서 나는 a.h와 stdint.h의 연관 순서는 다음과 같습니다.#include "a.h"
#include
main 함수는 간단한 Helloworld 인쇄입니다.
사전 처리된 파일을 생성하려면 다음과 같이 하십시오.gcc -E test.c -o test.i
테스트 중입니다.i에서 이러한 typedef 정의를 발견했습니다.typedef unsigned long int unsigned long long;
C 파일에 include "a.h"주석을 달겠습니다.test.i의 대응행은 다음과 같습니다.typedef unsigned long int uint64_t;
그래서 컴파일하는 과정에서 #define 정의가 바뀌었고 컴파일할 때 오류가 발생합니다.
그러나 왜 unsigned와longlonglong 두 개의 error를 잘못 보고했는지 더 많은 탐색이 필요합니다...나는 개인적으로 컴파일러의 밑바닥 때문이라고 추측한다.
총결산
define는 예처리 단계에서, typedef는 컴파일 단계에서, 두 개의 헤더 파일에서 uint64_를 정의합니다t, 정의 방식이 다르기 때문에 컴파일러는 우리가 롱롱롱의 데이터 형식을 성명한다고 생각한다.
posted @
2019-03-04 11:00 어렸을 때 열심히 읽었어요(
...) 설명(
...) 모음 편집
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
stdint.h:120:28: error: duplicate 'unsigned'
stdint.h:120:28: error: 'long long long' is too long for GCC
#if __have_long64
typedef signed long int64_t;
typedef unsigned long uint64_t;
#define __int64_t_defined 1
#elif __have_longlong64
typedef signed long long int64_t;
typedef unsigned long long uint64_t;
#define __int64_t_defined 1
#elif __STDINT_EXP(INT_MAX) > 0x7fffffff
typedef signed int int64_t;
typedef unsigned int uint64_t;
#define __int64_t_defined 1
#endif
#ifndef uint64_t
#define uint64_t unsigned long long
#endif
#include "a.h"
#include
gcc -E test.c -o test.i
typedef unsigned long int unsigned long long;
typedef unsigned long int uint64_t;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.