2008-09-19 26 views
32

我該如何編寫一個擴展以包含換行符的cpp宏?如何在cpp宏中生成換行符?

+2

你能解釋一下你爲什麼要這樣做嗎? – 2008-09-19 03:22:49

+1

@LouFranco可能會使它更具可讀性? – 2014-01-19 17:28:14

+1

看下面的答案似乎很清楚,你不能。考慮到這個問題,這個問題可能是「我不知道它是什麼」。對你來說一個更好的解決方案(以及使用C宏時常見的方法)可能是讓宏只做最簡單的工作,然後將大部分工作交給一個輔助函數。 _宏的功能+非優化版本中功能良好的格式化C代碼= win win__ – 2014-07-14 19:44:04

回答

-3

使用\,就像這樣:

#define my_multiline_macro(a, b, c) \ 
if (a) { \ 
    b += c; \ 
} 
7

Ç& C++編譯器忽略未加引號的空格(除>>模板的問題),因此讓宏發出新行並沒有真正意義。通過用反斜槓結束宏的每一行,可以使宏成多行,但不會輸出換行符。

-2

不太清楚你在這裏問什麼。你想在多行上使用宏嗎?

#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

5

C編譯器知道的空白,但它並沒有空格,製表符或新行區分。

如果你的意思是我怎麼有一個字符串內新線在宏,則:

#define SOME_STRING "Some string\n with a new line." 

會工作。

-4

在行尾使用\。 (0)

#define foo() do \ 
{ 
    //code goes here \ 
    \ 
    \ 
}while(0); 

另外,請記住在許多情況下使用父級。

實施例:

#define foo(x) a+b 
//should be 
#define foo(x) (a+b) 
8

這是不可能的。這隻有在您查看列表文件或預處理器輸出時纔有意義。

編寫宏以使它們更容易閱讀的常用技術是使用\字符將宏繼續到下一行。

我(相信我)已經看到了編譯器在列表輸出中包含了擴展宏中的新行 - 這是爲了您的好處。這隻對我們窮人使用擴展宏來試圖理解我們真正要求編譯器做什麼有用。它對編譯器沒有任何影響。

C & C++語言以相同的方式處理字符串外部的所有空白。就像一個分隔符。

13

我正在處理一個涉及大量預處理器宏函數的大型項目,以合成任何不能由模板替換的代碼。相信我,我熟悉各種模板技巧,但只要沒有標準化,鍵入安全元編程語言,可以直接創建代碼,我們將不得不堅持使用舊的預處理器及其繁瑣的宏來解決一些問題需要在沒有的情況下寫十次以上的代碼。 一些宏跨越很多行,並且它們在預處理代碼中很難讀取。因此,我想到了解決這個問題的方法,並且我想出了以下內容:

假設我們有一個跨越多行的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__字符串替換換行符,使用您最喜歡的文本編輯器,並且最終會在預處理後以可讀的形式顯示替換後的宏的結果,編譯器會看到,除了人爲引入的換行符外。