我該如何編寫一個擴展以包含換行符的cpp宏?如何在cpp宏中生成換行符?
回答
使用\
,就像這樣:
#define my_multiline_macro(a, b, c) \
if (a) { \
b += c; \
}
Ç& C++編譯器忽略未加引號的空格(除>>模板的問題),因此讓宏發出新行並沒有真正意義。通過用反斜槓結束宏的每一行,可以使宏成多行,但不會輸出換行符。
不太清楚你在這裏問什麼。你想在多行上使用宏嗎?
#define NEWLINE_MACRO(x) line1 \
line2 \
line3
此外,如果您想包括文字在您的宏:
#define NEWLINE_MACRO(x) ##x
你什麼你把在x將到位## x的,所以:
NEWLINE_MACRO(line1) // is replaced with line1
這可能對製作自定義全局函數很有幫助,然後只需要更改一部分函數名稱。
另外:
#define NEWLINE_MACRO(x) #x // stringify x
威爾把引號圍繞x
C編譯器知道的空白,但它並沒有空格,製表符或新行區分。
如果你的意思是我怎麼有一個字符串內新線在宏,則:
#define SOME_STRING "Some string\n with a new line."
會工作。
在行尾使用\。 (0)
#define foo() do \
{
//code goes here \
\
\
}while(0);
另外,請記住在許多情況下使用父級。
實施例:
#define foo(x) a+b
//should be
#define foo(x) (a+b)
這是不可能的。這隻有在您查看列表文件或預處理器輸出時纔有意義。
編寫宏以使它們更容易閱讀的常用技術是使用\字符將宏繼續到下一行。
我(相信我)已經看到了編譯器在列表輸出中包含了擴展宏中的新行 - 這是爲了您的好處。這隻對我們窮人使用擴展宏來試圖理解我們真正要求編譯器做什麼有用。它對編譯器沒有任何影響。
C & C++語言以相同的方式處理字符串外部的所有空白。就像一個分隔符。
我正在處理一個涉及大量預處理器宏函數的大型項目,以合成任何不能由模板替換的代碼。相信我,我熟悉各種模板技巧,但只要沒有標準化,鍵入安全元編程語言,可以直接創建代碼,我們將不得不堅持使用舊的預處理器及其繁瑣的宏來解決一些問題需要在沒有的情況下寫十次以上的代碼。 一些宏跨越很多行,並且它們在預處理代碼中很難讀取。因此,我想到了解決這個問題的方法,並且我想出了以下內容:
假設我們有一個跨越多行的C/C++宏,例如,在名爲MyMacro.hpp
// Content of MyMacro.hpp
#include "MultilineMacroDebugging.hpp"
#define PRINT_VARIABLE(S) \
__NL__ std::cout << #S << ": " << S << std::endl; \
__NL__ /* more lines if necessary */ \
__NL__ /* even more lines */
在每一個文件,其中我定義這樣一個宏文件,我包括另一個文件MultilineMacroDebugging.hpp,包含以下:
// Content of MultilineMacroDebugging.hpp
#ifndef HAVE_MULTILINE_DEBUGGING
#define __NL__
#endif
這定義了一個空宏__NL__
,這使得__NL__
定義在預處理期間消失。該宏然後可以用在某個地方,例如, 的文件名爲MyImplementation.cpp。
// Content of MyImplementation.cpp
// Uncomment the following line to enable macro debugging
//#define HAVE_MULTILINE_DEBUGGING
#include "MyMacro.hpp"
int a = 10;
PRINT_VARIABLE(a)
如果我需要調試PRINT_VARIABLE
宏,我只是取消對在MyImplementation.cpp定義宏HAVE_MULTILINE_DEBUGGING
行。結果代碼當然不會編譯,因爲__NL__
宏結果未定義,導致它保留在編譯代碼中,但是它可以被預處理。
現在至關重要的一步是用預先處理輸出中的__NL__
字符串替換換行符,使用您最喜歡的文本編輯器,並且最終會在預處理後以可讀的形式顯示替換後的宏的結果,編譯器會看到,除了人爲引入的換行符外。
- 1. 如何使用cpp將宏變成字符串?
- 2. 如何在生成XML時保留CDATA中的換行符?
- 3. 如何在反應中的循環內生成換行符?
- 4. 如何在生成的html代碼中插入換行符
- 5. 如何在Django模板中生成換行符
- 6. 如何在生成的html中添加換行符
- 7. 生成使用CPP
- 8. Haxe - 生成exe(cpp)
- 9. 在asciidoc中,如何爲PDF生成執行一個宏?
- 10. 如何用Dev-cpp生成.lib文件?
- 11. 控制Clojure宏中的符號生成
- 12. cpp宏的條件派生用法
- 13. 生成的CSV中沒有換行符
- 14. 報表生成器中的換行符
- 15. 如何在Stata宏變量中插入換行符?
- 16. 另一個宏裏面的Clojure宏:如何從符號生成的字符串
- 17. 如何設置eclipse cpp生成多個可執行文件
- 18. 如何控制Handlebars如何生成換行符?
- 19. 生成與宏
- 20. 生成文件:如何調用宏在宏
- 21. 速度宏換行符
- 22. .cpp文件的生成
- 23. 在cpp中使用define宏替換函數的名稱
- 24. 如何\ n轉換成HTML換行符
- 25. 如何在eXist-db應用程序中生成XSL-FO中的換行符?
- 26. 如何在生成文件中定義頭文件中的宏
- 27. X宏生成雜散運算符
- 28. 如何從Excel VBA宏生成XML?
- 29. 自動從.cpp/.c中生成.h
- 30. 如何在我的cpp程序中使用這個宏?
你能解釋一下你爲什麼要這樣做嗎? – 2008-09-19 03:22:49
@LouFranco可能會使它更具可讀性? – 2014-01-19 17:28:14
看下面的答案似乎很清楚,你不能。考慮到這個問題,這個問題可能是「我不知道它是什麼」。對你來說一個更好的解決方案(以及使用C宏時常見的方法)可能是讓宏只做最簡單的工作,然後將大部分工作交給一個輔助函數。 _宏的功能+非優化版本中功能良好的格式化C代碼= win win__ – 2014-07-14 19:44:04