1// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4// 5// This file defines preprocessor macros for stringizing preprocessor 6// symbols (or their output) and manipulating preprocessor symbols 7// that define strings. 8 9#ifndef BASE_STRINGIZE_MACROS_H_ 10#define BASE_STRINGIZE_MACROS_H_ 11#pragma once 12 13#include "build/build_config.h" 14 15// This is not very useful as it does not expand defined symbols if 16// called directly. Use its counterpart without the _NO_EXPANSION 17// suffix, below. 18#define STRINGIZE_NO_EXPANSION(x) #x 19 20// Use this to quote the provided parameter, first expanding it if it 21// is a preprocessor symbol. 22// 23// For example, if: 24// #define A FOO 25// #define B(x) myobj->FunctionCall(x) 26// 27// Then: 28// STRINGIZE(A) produces "FOO" 29// STRINGIZE(B(y)) produces "myobj->FunctionCall(y)" 30#define STRINGIZE(x) STRINGIZE_NO_EXPANSION(x) 31 32// The following are defined only on Windows (for use when interacting 33// with Windows APIs) as wide strings are otherwise deprecated. 34#if defined(OS_WIN) 35 36// Second-level utility macros to let us expand symbols. 37#define LSTRINGIZE_NO_EXPANSION(x) L ## #x 38#define TO_L_STRING_NO_EXPANSION(x) L ## x 39 40// L version of STRINGIZE(). For examples above, 41// LSTRINGIZE(A) produces L"FOO" 42// LSTRINGIZE(B(y)) produces L"myobj->FunctionCall(y)" 43#define LSTRINGIZE(x) LSTRINGIZE_NO_EXPANSION(x) 44 45// Adds an L in front of an existing ASCII string constant (after 46// expanding symbols). Does not do any quoting. 47// 48// For example, if: 49// #define C "foo" 50// 51// Then: 52// TO_L_STRING(C) produces L"foo" 53#define TO_L_STRING(x) TO_L_STRING_NO_EXPANSION(x) 54 55#endif // defined(OS_WIN) 56 57#endif // BASE_STRINGIZE_MACROS_H_ 58