중첩 된 주석 문제를 해결하는 방법


23

주석을 중첩 할 수없는 언어는 한 언어로만 나타나지 않습니다. 이 문제에 대한 좋은 해결책이 있습니까? C / C ++ 및 Java의 한 가지 해결 방법은 한 줄 주석 만 사용하는 것이지만 더 큰 블록을 주석 처리하는 것은 불가능합니다. 나는 이런 식으로 직면하고있다 :

</li><!--
                <li><!-- Save -->

따라서 수동으로 주석을 편집하고 편집해야합니다. 여러 언어로 어떻게 처리해야하는지 조언 해 줄 수 있습니까? 확실하지 않지만 파이썬에는 파이썬 '''#주석 을 포함 할 수 있는 방법 으로이 솔루션이 있습니까? `


4
편집자 만이 당신을 도울 수 있다고 생각합니다. IDLE은 Python IIRC에 대한 주석을 차단합니다.
Erik Reppen

7
파이썬 에는 블록 주석 이 없습니다 . '''하고 """있는 문자열 리터럴 . 인터프리터는 컴파일 중에 바이트 바이트로 평가하고 문자열 리터럴을 no-ops로 인식하므로 바이트 코드 실행 /로드 시간이 느려지지 않습니다. def인터프리터가 함수에 대한 문서를 제공한다고 가정하기 때문에 문서 문자열, 즉 본문 바로 다음 이나 본문 바로 앞에있는 문자열 리터럴 은 제거되지 않습니다.
Bakuriu

7
C / C ++에서 큰 섹션을 제거하려면 #if 0<code> 를 사용하십시오 #endif. 따라서 이것은 실제로 문제가되지 않습니다. 주석을 사용하여이를 수행하는 것은 잘못된 도구입니다.
Martin York

1
Javadoc과 같이 강제하지 않는 한 오랫동안 라인 주석 만 사용하도록 전환했습니다. 물론 편집기 지원 (또는 최소한 열 모드)이 필요합니다.
ziggystar

답변:


46

가장 좋은 해결책은 분명히 의견을 내포하지 않는 것입니다. 중첩 된 주석은 일반적으로 잘못된 주석을 사용하고 있다는 표시입니다. 가장 일반적인 예는 주석 자체를 포함하는 주석 처리 된 코드이며, 수정은 주석 처리하지 않고 코드를 제거하는 것입니다.

즉, 많은 프로그래밍 언어에는 둘 이상의 유형의 주석 구문이 있으며이 사실을 사용하여 하나 이상의 레벨을 중첩 할 수 있습니다. 예를 들어, Java에서 :

/* This is commented out!
Foo.bar.baz();
// And now for something completely different...
Quux.runWith(theMoney);
*/

또한 많은 언어에서 적어도 한 가지 유형의 주석은 친절합니다. C와 같은 언어에서는 행 주석 내부의 행 주석이 무시됩니다.

// some_commented_out(code);
// // This is a comment inside the comment!
// // Still inside the nested comment.
// some_more_code_in(outer_comment);

대부분의 IDE는 한 번의 작업으로 라인 주석으로 전체 코드 블록 주석 처리를 지원하며 이러한 종류의 주석 스타일을 올바르게 처리합니다. 파이썬에서 같은 예 :

# some_commented_out(code)
# # This is a comment inside the comment!
# # Still inside the nested comment.
# some_more_code_in(outer_comment)

종종 특정 프로젝트에 대한 코딩 표준에는 언제 어떤 주석 스타일을 사용해야하는지에 대한 규칙이 있습니다. 일반적인 규칙은 /* */메소드 및 클래스 문서에 블록 주석 ( )을 사용하고 //메소드 본문 내부에있는 주석에 인라인 주석 ( )을 사용하는 것입니다. 예 :

/**
 * Helper class to store Foo objects inside a bar.
 */
public class Foobar {
    /**
     * Stores a Foo in this Foobar's bar, unless the bar already contains
     * an equivalent Foo.
     * Returns the number of Foos added (always 0 or 1).
     */
    public int storeFoo(Foo foo) {
        // Don't add a foo we already have!
        if (this.bar.contains(foo)) {
            return 0;
        }
        // OK, we don't have this foo yet, so we'll add it.
        this.bar.append(foo);
        return 1;
    }
}

이러한 스타일을 사용하면 /* */주석 을 중첩해야 할 가능성이 거의 없습니다 (전체 메소드 또는 클래스를 일시적으로 비활성화해야하는 경우 이름을 바꾸는 것이 더 좋지는 않더라도 훌륭하게 작동합니다). 및 //코멘트 당신의 IDE의 도움으로 적어도 둥지.

마지막으로 코드를 비활성화하기 위해 많은 프로그래밍 언어의 다른 옵션이 있습니다. 예를 들어 C에서는 전처리기를 활용할 수 있습니다.

this_is(activated);
#if 0
this_is(!activated);
/* Comments inside this block don't really nest, they are simply removed
   along with the rest of the block! */
#endif

동적 언어에서는 보통 if대신 일반 명령문을 사용할 수 있습니다 .

<?php

if (0) {
   // This should never run... 
   some_stuff_that_should_never_run();
}

그러나 CPP 예제와 달리이 전략에서는 소스 파일 전체가 구문 상 유효해야하므로 유연하지 않습니다.

마지막으로 중첩 된 주석을 허용 하는 언어가 적어도 있습니다. 당신이 관심이 있다면 , wikipedia 좋은 비교 차트가 있습니다.


2
SQL의 일부 변형이 중첩 된 주석을 허용합니까?
Xavier Combelle

3
// And now for something completely different...
Vorac에

1
@Vorac : 참조를 좋아하게되어 기쁘다 : D
tdammers

18

C 및 C ++에는 중첩 된 블록 주석이 있습니다.

#if 0
#endif

많은 강조 편집기는 이것을 주석으로 이해하고 다른 많은 강조 표시는 적어도 조건부 비활성화 코드로 강조 표시합니다.

다른 많은 언어에서는 편집기 지원에 의존해야합니다. 줄 기반 주석 (perl, python, ruby, shell ...) 만있는 언어의 경우 주석 문자를 일정 범위의 모든 줄 앞에 추가하는 것이 간단하므로 대부분의 편집자가이를 수행 할 수 있습니다. 주석 문자가 두 배이기 때문에 전체 블록을 주석 처리하기 전에 주석이 무엇인지 알 수 있습니다. 여기서는 주석 처리가 유리합니다.

XML과 SGML은 아마도 가장 큰 고통 일 것입니다. 주석 정의는 어리 석습니다. 주석은 중첩하기가 쉽지 않았지만, 그렇지 않을뿐 아니라 --내부 주석 을 갖는 것은 완전히 금지되어 있습니다 . 불행히도 SGML / XML로 주석을 달기 위해 어떤 편집기가 잘 지원되는지 알 수 없습니다.


2
이러한 전 처리기 지시문을 실제 주석으로 사용한다고 생각하지 마십시오. C # #if _에서도 흥미롭지 만이 경우에는 잘 작동하며 Re #을 사용하여 VS에서 회색으로 표시되는 것과 같은 작업 을 수행해야합니다 . 좋은 팁!
절망의 애도

2

일반적인 해결책은 아니며 이상적인 것은 아니지만이 특정 문제를 해결하는 한 가지 방법은 서버 측 템플릿 처리 언어를 사용하여 중첩 된 코드 주석 요소에 대한 주석을 차단하는 것입니다. 이렇게하면 내용이 그대로 유지되지만 클라이언트 브라우저로 내용이 전송되지 않습니다.

파일이 다른 서버 측 처리를 필요로하지 않는 직선적이고 순수한 콘텐츠 인 경우 많은 도움이되지 않습니다. 이 경우와 더 일반적인 중첩 주석의 경우 왜 그렇게 하시겠습니까? 대부분의 경우, 처리하는 가장 좋은 방법은 모두 처리하지 않는 것입니다. 즉, 섹션을 제거하려면 섹션을 제거하고 아티팩트로서 해당 섹션을 부활시켜야하는 경우 버전 제어에서 차이점을 기억하도록하십시오.


0

HTML / XML의 경우에는 존재하지 않는 처리 명령을 사용할 수 있습니다 참조 SO에 대한 내 대답을

<?ignore
  <band height="20">
    <staticText>
      <reportElement x="180" y="0" width="200" height="20"/>
      <text><![CDATA[Hello World!]]></text>
    </staticText>
  </band>
?>
</detail>

0

Swift는 중첩 된 주석을 지원하므로 "주석을 중첩 할 수없는 하나의 언어로만 표시되지 않습니다"는 더 이상 진정한 진술이 아닙니다. 프로그래밍 언어로 중첩 된 주석에 대한 지원이 부족한 것에 불만이 있다면 Swift에 시도해보십시오.

/* This is the start of the first multiline comment.
 /* This is the second, nested multiline comment. */
 This is the end of the first multiline comment. */

스위프트 프로그래밍 언어 : 기본


0

D 프로그래밍 언어에는 다음과 같은 중첩 된 주석이 있습니다.

/+ This is a nested comment 
  /+ This is part of that a comment +/
  /* So is this */
+/
/+ /* This is another nested comment */ +/
/* /* This is not a nested comment */

즉, /++/의견 둥지입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.