Programing

들여쓰기 #defines

c10106 2022. 5. 4. 19:18
반응형

들여쓰기 #defines

알고 있다#defines 등은 보통 움푹 들어간 적이 없다. 왜?

나는 지금 끔찍한 혼합이 있는 어떤 코드에서 일하고 있다.#defines#ifdefs#elses#endifs 등. 이 모든 것들이 보통 C 코드에 섞여 있는 경우가 많다.은.#defines는 그들을 읽기 어렵게 만든다.그리고 들여쓰기 코드와 비 들여쓰기 코드 혼합#defines는 악몽이다.

왜 그럴까?#defines 일반적으로 들여쓰지 않는가?들여쓰지 않는 이유가 있는가(예: 아래 코드와 같은)?

#ifdef SDCC
    #if DEBUGGING == 1
        #if defined (pic18f2480)
            #define FLASH_MEMORY_END 0x3DC0
        #elif defined (pic18f2580)
            #define FLASH_MEMORY_END 0x7DC0
        #else
            #error "Can't set  up flash memory end!"
        #endif
    #else
        #if defined (pic18f2480)
            #define FLASH_MEMORY_END 0x4000
        #elif defined (pic18f2580)
            #define FLASH_MEMORY_END 0x8000
        #else
            #error "Can't set  up flash memory end!"
        #endif
    #endif
#else
    #if DEBUGGING == 1
        #define FLASH_MEMORY_END 0x7DC0
    #else
        #define FLASH_MEMORY_END 0x8000
    #endif
#endif

ANSI C 전처리는 줄의 시작과 "#" 문자 사이에 공간을 허용하지 않았다. 선행 "#"는 항상 첫 번째 열에 배치되어야 했다.

ANSI C 이전 컴파일러는 요즘 존재하지 않는다.원하는 모든 스타일("#" 이전의 공간 또는 "#"과 식별자 사이의 공간)을 사용하십시오.

http://www.delorie.com/gnu/docs/gcc/cpp_48.html

일부에서 이미 말했듯이, 일부 사전 ANSI 컴파일러들은 #를 줄의 첫 번째 문자로 요구했지만, 디프로세서 지시를 거기에 첨부할 필요는 없었기 때문에 이렇게 들여쓰기를 했다.

#ifdef SDCC
#  if DEBUGGING == 1
#    if defined (pic18f2480)
#      define FLASH_MEMORY_END 0x3DC0
#    elif defined (pic18f2580)
#      define FLASH_MEMORY_END 0x7DC0
#    else
#      error "Can't set  up flash memory end!"
#    endif
#  else
#    if defined (pic18f2480)
#      define FLASH_MEMORY_END 0x4000
#    elif defined (pic18f2580)
#      define FLASH_MEMORY_END 0x8000
#    else
#      error "Can't set  up flash memory end!"
#    endif
#  endif
#else
#  if DEBUGGING == 1
#    define FLASH_MEMORY_END 0x7DC0
#  else
#    define FLASH_MEMORY_END 0x8000
#  endif
#endif

나는 옛날 유닉스 헤더에서 이런 스타일을 자주 보았지만 그런 코드에서 구문 색칠이 잘 안 되는 경우가 많아서 싫어.나는 프리프로세서 지시사항에 매우 가시적인 색상을 사용하여 그것들이 돋보이게 한다(이들은 메타 레벨에 있으므로 코드의 정상적인 흐름의 일부가 되어서는 안 된다).SO가 순서에 유용하게 색칠하지 않는 것까지도 볼 수 있다.

전처리기 지시문 구문 분석과 관련하여, C99 표준(및 앞의 C89 표준)은 컴파일러가 논리적으로 수행하는 작업 순서에 대해 명확했다.특히, 나는 이 코드가 다음과 같은 것을 의미한다고 믿는다.

/* */ # /* */ include /* */ <stdio.h> /* */

다음 항목과 동일하다:

#include <stdio.h>

좋든 나쁘든 간에, '-std=c89 -pedantic'을 가진 GCC 3.4.4는 댓글이 많은 선을 어쨌든 받아들인다.나는 그것을 스타일이라고 옹호하는 것이 아니다. 단 1초도 아니다.나는 단지 그것이 가능하다고 생각한다.

ISO/IEC 9899:1999 섹션 5.1.1.2 번역 단계는 다음과 같이 말한다.

  1. [문자 매핑, 삼각형 포함]

  2. [라인 스플리싱 - 백슬래시 뉴라인 제거]

  3. 소스 파일은 사전 처리 토큰과 화이트 스페이스 문자 시퀀스(코멘트 포함)로 분해된다.원본 파일은 부분 사전 처리 토큰 또는 부분 설명으로 끝나서는 안 된다.각각의 코멘트는 하나의 공백 문자로 대체된다.새로운 줄 문자는 유지된다.뉴라인 이외의 공백 문자의 비빈 순서가 각각 유지되는지 아니면 하나의 공백 문자로 대체되는지 여부는 구현 정의된다.

  4. 사전 처리 지시문을 실행하고 매크로 호출이 확장되며, [...]

섹션 6.10 사전 처리 지침은 다음과 같다.

사전 처리 지시어는 (번역 단계 4 시작 시) 소스 파일의 첫 번째 문자(선택적으로 새로운 줄 문자를 포함하지 않는 공백 후)이거나 하나 이상의 새로운 줄 문자를 포함하는 공백을 따르는 # 사전 처리 토큰으로 시작하는 일련의 사전 처리 토큰으로 구성된다.다음 뉴라인 캐릭터에 의해 끝났다.

가능한 유일한 논쟁은 '(번역 단계 시작 시)'라는 괄호 표현인데, 이는 해시 이전의 논평이 4단계가 끝날 때까지 공백으로 대체되지 않기 때문에 반드시 부재해야 한다는 것을 의미할 수 있다.

다른 사람들이 지적했듯이, 사전 표준 C 전처리기들은 여러 가지 방법으로 균일하게 행동하지 않았고, 전처리기 지시의 전과 전처리기 지시의 공간은 서로 다른 컴파일러들이 다른 일을 한 영역 중 하나였다.

논평 분석에 앞서 백슬래시 뉴라인 제거가 이뤄지는 것은 주목할 만하다.따라서 끝내서는 안 된다.//뒷말을 늘어놓다

현재 이용 가능한 거의 모든 C/CPP 컴파일러에서는 제한되지 않는다.코드를 어떻게 정렬할지 결정하는 것은 사용자의 몫이다.행복한 코딩이네.

왜 더 흔하지 않은지 모르겠어.나는 확실히 전처리기 지시문을 삽입하는 것을 좋아할 때가 있다.

자꾸 방해가 되는 것 중 하나는(그리고 가끔 내가 시도를 멈추도록 설득하는 것) 많은 또는 대부분의 편집자/IDE들이 사소한 일에도 그 지시를 1열에 던질 것이라는 것이다.정말 짜증나는 일이군

요즘 나는 이것이 주로 스타일의 선택이라고 믿는다.나는 먼 과거의 어느 시점에서 모든 컴파일러들이 전처리기 정의의 들여쓰기 개념을 지지하지는 않았다고 생각한다.나는 몇 가지 조사를 했고 그 주장을 뒷받침할 수 없었다.그러나 어떤 경우든, 현대의 모든 컴파일러들은 사전 프로세서 매크로의 들여쓰기 사상을 지지하는 것으로 보인다.나는 C나 C++ 규격의 복사본이 없어서 이것이 표준 동작인지 아닌지 모르겠다.

그게 좋은 스타일인지 아닌지에 대해서.개인적으로, 나는 그들 모두를 좌익으로 유지하는 생각이 좋아.그것은 당신이 그들을 찾을 수 있는 일관된 장소를 제공한다.응, 중첩된 매크로가 있으면 짜증날 수 있어.하지만 들여보내면 결국 더 이상해 보이는 암호로 끝나게 될 거야

#if COND1
void foo() {
  #if COND2
  int i;
    #if COND3
  i = someFunction()
  cout << i << eol;
    #endif
  #endif
}
#endif

예를 들어, 중첩된 지시의 복잡한 구조를 가지고 있는 것을 볼 때, 그것을 더 명확하게 하기 위해 들여쓰기를 사용하는 것이 적절할 수 있다.

개인적으로 나는 대부분의 시간을 들여놓지 않는 것이 유용하다고 생각한다. 왜냐하면 이 명령들은 당신의 코드의 나머지 부분과 별도로 작동하기 때문이다.#ifdef와 같은 지시사항은 컴파일러가 당신의 코드를 보기 전에 사전 프로세서에 의해 처리되므로, #ifdef 지시문 이후의 코드 블록은 컴파일되지 않을 수도 있다.

코드의 나머지 부분과 지시문을 시각적으로 분리하는 것이 (예를 들어 지시문의 전용 블록이 아닌) 코드로 대체될 때 더 중요하다.

나는 지금 #defines, #ifdefs, #elses, #endiffs, #etc가 끔찍하게 섞인 코드 작업을 하고 있다.이 모든 것들이 보통 C 코드에 섞여 있는 경우가 많았다.#defines의 비표시는 그들을 읽기 어렵게 만든다.그리고 움푹 들어간 코드와 비음질적인 #defines의 혼합은 악몽이다.

일반적인 해결책은 지시사항에 대해 코멘트하여 지시사항이 무엇을 참조하는지 쉽게 알 수 있도록 하는 것이다.

#ifdef FOO
/* a lot of code */
#endif /* FOO */

#ifndef FOO
/* a lot of code */
#endif /* not FOO */

이게 오래된 주제인 건 알지만 해결책을 찾느라 이틀을 허비했어.나는 당신이 코드를 많이 가지고 있다면 코드를 더 깨끗하게 만든다는 최초 게시물에 동의한다(나의 경우 나는 자세한 로깅을 활성화/비활성화하기 위해 지시문을 사용한다).마침내, 나는 Visual Studio 2017이 작동하는 해결책을 찾았다.

#pragma 식을 들여쓰려면 다음에서 사용 가능으로 설정하십시오.도구 > 옵션 > 텍스트 편집기 > C/C++ > 형식 > 들여쓰기 > 전처리기 지시의 위치 > 들여쓰기 남기기

유일하게 남은 문제는 자동 코드 레이아웃이 그 포맷을 고쳤다는 것이다 =()

참조URL: https://stackoverflow.com/questions/789073/indenting-defines

반응형