định dạng constexpr nếu trong chế độ c ++


10

Gần đây tôi đã bắt đầu sử dụng C ++ 17, mang lại constexpr nếu. Điều này tuy nhiên vít lên c++-modethụt đầu dòng mặc định.

// emacs 25.3.2 with --no-init
if constexpr (n == 1) {
    // Why?
  } else if constexpr (n == 2) {
    // This is a mess...
  } else {
  // and it keeps getting weird
}

Có ai không

  1. Biết một sự thay thế đơn giản hơn cho chế độ cc?
  2. Biết làm thế nào tôi có thể khắc phục vấn đề đặc biệt này?

Câu trả lời:


6

CẬP NHẬT: Phiên bản giả định mà tôi đặt ở đó trong câu hỏi ban đầu ( emacs-26.0.90.tar.gz) có một lỗi gây ra các vòng lặp vô cực nhất định trong khi phân tích bộ đệm, đặc biệt là khi sử dụng <mã thông báo trong ngữ cảnh xác nhận, như viết <là ký tự đầu tiên của bộ đệm trống trong Java hoặc C ++ hoặc sau từ khóa template. Lỗi đã được sửa trong emacs-26nhánh, vì vậy đó là những gì bạn phải tải xuống thay thế.


Tôi đã mất rất nhiều thời gian để tìm ra câu trả lời và học cách tùy chỉnh thuộc tính theo ngôn ngữ elisp, nhưng, một cách khắc phục bằng cách nói với cc-modeđó constexprlà "tên tiếng ồn", có nghĩa là nó sẽ được coi là một khoảng trắng và do đó bị bỏ qua bởi trình phân tích cú pháp.

Có một điều là trong bản phát hành ổn định cuối cùng của emacs (25.3), tính năng thêm từ tiếng ồn không được thêm vào, ngay cả khi nó ở trong repo kể từ tháng 2 năm 2016, vì vậy bạn phải tải xuống phiên bản không phát hành.

cd tmp_folder_of_your_choice

sudo apt-get install build-essential # if you don't have it yet
sudo apt-get build-dep emacs24 # get all dependancies to build emacs

# Not this: wget https://github.com/emacs-mirror/emacs/archive/emacs-26.0.90.tar.gz

wget -O emacs-26.zip https://github.com/emacs-mirror/emacs/archive/e8636ac8cc96e1e7e948f04091792da09dafcc76.zip

# or just the last version of the branch, but the exact version I have is the one above
# wget https://github.com/emacs-mirror/emacs/archive/emacs-26.zip

unzip emacs-26.zip
cd emacs-emacs-26

./autogen.sh
./configure
make
sudo make install
emacs ~/.emacs

Và sau đó, ví dụ ở cuối .emacstệp, thêm:

; Load the mode before-hand to make the symbols visible
(require 'cc-mode)
(custom-set-variables '(c-noise-macro-names '("constexpr")))

trong khi điều này thật tuyệt, và tôi đang thử nó ngay bây giờ, nó vẫn cảm thấy giống như một bản hack - có cách nào tốt hơn để thêm nó vào vị trí cú pháp đó không?
topisani

Tôi không biết, nhưng giải pháp này hoạt động hoàn hảo với tôi.
Peregring-lk

vâng, nó hoạt động với tôi, với dự án tuyệt vời này cũng như git emacs mới nhất
topisani

@topisani Xin vui lòng, bạn có thể thấy câu hỏi đó nếu điều tương tự xảy ra với bạn sau khi cài đặt phiên bản emacs cuối cùng không? emacs.stackexchange.com/q/36423/14016
Peregring-lk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.